安卓第三方支付之微信支付

作者: android00 发布时间: 2018-08-06 浏览: 260 次

1、相关地址 
微信开发平台:

https://pay.weixin.qq.com/wiki/doc/api/index.html1

SDK下载:

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_11

异步通知文档: 
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3 
微信支付测试接口: 
http://wxpay.wxutil.com/pub_v2/app/app_pay.php 
微信开发者平台登录入口 
https://open.weixin.qq.com/ 
微信支付签名工具: 
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 
注意: 
一:如果运行demo,要将微信demo的debug.keystore放到本地。 
二:支付失败要清理微信缓存。 
微信支付很特殊:keystore签名+包名绑定+应用名称,安全码策略。 
2、集成步骤 
2.1、在build.gradle文件中,添加如下依赖:

dependencies {
   compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'}

2.2、清单文件声明权限和activity

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<activity   android:name="net.sourceforge.simcpux.wxapi.WXPayEntryActivity"
   android:exported="true"
   android:launchMode="singleTop"/>

注意:上述声明的activity(WXPayEntryActivity)需要从demo中拷贝WXPayEntryActivity.java文件放到我们工程中,包名要保持不变。

2.3、 调用微信支付sdk 
赋值后调用sendReq完成支付

/**调用微信支付*/public void sendPayRequest() {
    PayReq req = new PayReq();
    req.appId = payInfo.getAppId();
    req.partnerId = payInfo.getPartnerId();
    req.prepayId = payInfo.getPrepayId();
    req.nonceStr = payInfo.getNonceStr();
    req.timeStamp = payInfo.getTimestamp();
    req.packageValue = payInfo.getPackageValue();
    req.sign = payInfo.getSign();    // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
    //3.调用微信支付sdk支付方法
    api.sendReq(req);
}

2.4、处理支付结果 
在net.sourceforge.simcpux.wxapi.WXPayEntryActivity.java类的onResp方法中处理支付结果:

@Override
public void onResp(BaseResp resp) {
    Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
    //支付成功
    if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("支付结果");
        builder.setMessage(resp.errCode + "");
        builder.show();
    }
}1234567891011

3、代码MainActivity

package net.sourceforge.simcpux;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import com.alibaba.fastjson.JSON;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.VolleyError;import com.android.volley.toolbox.StringRequest;import com.android.volley.toolbox.Volley;import com.tencent.mm.opensdk.modelpay.PayReq;import com.tencent.mm.opensdk.openapi.IWXAPI;import com.tencent.mm.opensdk.openapi.WXAPIFactory;public class MainActivity extends AppCompatActivity implements Response.Listener<String>, Response.ErrorListener {
    private String url;
    private WeiXinBean weiXinBean;
    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //微信支付测试接口,正式开发必须使用公司自己的接口
        url = "http://wxpay.wxutil.com/pub_v2/app/app_pay.php";
        initWechat();
    }    /**
     * 初始化微信支付api
     */
    private void initWechat() {
        api = WXAPIFactory.createWXAPI(this, "wxb4ba3c02aa476ea1");
    }

    public void wechatpay(View view){
        //1.post信息到服务器
        StringRequest request = new StringRequest(url, this, this);
        RequestQueue queue = Volley.newRequestQueue(this);
        queue.add(request);
        //4.处理支付结果:成功、失败、取消
    }

    @Override
    public void onResponse(String response) {
        //2.解析服务器返回,获取“支付串码”
        response = response.replaceAll("package", "packageValue");
        weiXinBean = JSON.parseObject(response, WeiXinBean.class);
        Log.e("result", weiXinBean.toString());
        //3.调用微信支付sdk的支付方法,传入支付串码
        sendPayRequest();
    }

    @Override
    public void onErrorResponse(VolleyError volleyError) {

    }    /**调用微信支付*/
    public void sendPayRequest() {
        PayReq req = new PayReq();
        req.appId = weiXinBean.getAppid();
        req.partnerId = weiXinBean.getPartnerid();
        //预支付订单
        req.prepayId = weiXinBean.getPrepayid();
        req.nonceStr = weiXinBean.getNoncestr();
        req.timeStamp = weiXinBean.getTimestamp()+"";
        req.packageValue = weiXinBean.getPackageValue();
        req.sign = weiXinBean.getSign();
        // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
        //3.调用微信支付sdk支付方法
        api.sendReq(req);
    }
}

4、小结 
调用:初始PayReq对象里面的核心参数,然后调用api.sendReq(req)。 
在net.sourceforge.simcpux.wxapi.WXPayEntryActivity里面处理支付结果,需要拷贝到我们项目工程里面,包名不能变,否则接受不到结果。 
异步通知:微信服务器通知商户服务器支付结果,商户服务器需要给微信服务器返回响应。 
支付串码是谁生成的:除了prepayId是微信服务器生成的,其他参数都是商户服务器生成。