Android 微信支付接入流程

一、Android微信支付集成,准备工作

1,微信开放平台 注册,获取App id等信息

Android 微信支付接入流程_第1张图片
注册自己的应用.png

注册过程中填写相应的信息即可,需要注意应用签名的获取。

Android 微信支付接入流程_第2张图片
应用签名.png

应用签名获取步骤:

  • 找到自己项目的签名文件,比如我的存放在项目中,如下图:


    Android 微信支付接入流程_第3张图片
    签名文件.png
  • 打开命令提示框,输入keytool -v -list -keystore 路径 ,输入密码后会显示出jks信息,例如:
    Android 微信支付接入流程_第4张图片
    获取签名信息.png

    注意:这里的MD5就是需要的,将中间的 : 删除,就是应用签名,也可以通过微信的一个工具apk,来获取微信应用签名获取apk下载 ,可以通过该工具对比 上面的MD5,是否一致!应用信息填写完毕,然后提交申请即可。
Android 微信支付接入流程_第5张图片
获取应用签名工具.png

2,Android端集成

  • 在app model下添加以下依赖:
    //wx 支付依赖(包含统计功能)
    implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

    //不包含统计功能
    //implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

  • 接收微信回调需要一个WXPayEntryActivity,目录如下图,推荐直接拷贝微信demo中的类,这里需要注意WXPayEntryActivity 路径必须为:绑定的商户应用包名 + wxapi + WXPayEntryActivity,比如:我在微信开发平台注册包名为:com.example.wxWXPayEntryActivity 的路径就需要为:com.example.wx.wxapi.WXPayEntryActivity
    Android 微信支付接入流程_第6张图片
    微信回调的类.png

注:微信demo

附上自己的类:

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
    private static final String TAG = "WXPayEntryActivity";

    private IWXAPI api;
    private String app_id = "";//微信开发后台申请的app_id

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //这里可以不填写
//        setContentView(R.layout.pay_result);

        api = WXAPIFactory.createWXAPI(this, app_id);
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq req) {
    }

    /**
     * 处理结果回调
     *
     * @param resp
     */
    @Override
    public void onResp(BaseResp resp) {
        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);

        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {

            switch (resp.errCode) {
                case 0://支付成功
                    Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "onResp: resp.errCode = 0   支付成功");
                    break;
                case -1://错误,可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
                    Toast.makeText(this, "支付错误" + resp.errCode, Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "onResp: resp.errCode = -1  支付错误");
                    break;
                case -2://用户取消,无需处理。发生场景:用户不支付了,点击取消,返回APP。
                    Log.d(TAG, "onResp: resp.errCode = -2  用户取消");
                    Toast.makeText(this, "用户取消" + resp.errCode, Toast.LENGTH_SHORT).show();
                    break;

            }

            finish();//这里需要关闭该页面
        }

    }

}

需要在注册清单AndroidManifest.xml中添加权限与WXPayEntryActivity

    
    
    

    
  • 调用API前,需要先向微信注册您的APPID,注册微信支付App Id,有两种方式
//*********1,清单文件中直接注册********
        
            
                

                

                
                
            
        


//**************2,在应用入口Application,app id注册到微信************************
IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);

// 将该app id 注册到微信   AppID: 申请到的AppID
msgApi.registerApp(AppID);

二、Android 支付过程

1,Android端与后台交互的大致流程如下:

Android 微信支付接入流程_第7张图片
微信支付,Android端流程.png

2,发起微信支付
Android App 调起微信支付所需的参数如下,这里的参数绝大多数是上图流程中调用后台订单接口返回:

Android 微信支付接入流程_第8张图片
调起微信支付所需要的请求参数 .png

后台返回数据后,调起微信支付的代码如下:

/**
     * 调支付的方法
     * 

* 注意: 每次调用微信支付的时候都会校验 appid 、包名 和 应用签名的。 这三个必须保持一致才能够成功调起微信 * * @param wxPayBean */ private void startWechatPay(WxPayBean wxPayBean) { tv_paylist.setText(tv_paylist.getText() + "\n\n调起微信支付...."); //这里的appid,替换成自己的即可 IWXAPI api = WXAPIFactory.createWXAPI(this, Constant.WxPayAppId); api.registerApp(Constant.WxPayAppId); //这里的bean,是服务器返回的json生成的bean PayReq payRequest = new PayReq(); payRequest.appId = Constant.WxPayAppId; payRequest.partnerId = wxPayBean.getPartnerid(); payRequest.prepayId = wxPayBean.getPrepayid(); payRequest.packageValue = "Sign=WXPay";//固定值 payRequest.nonceStr = wxPayBean.getNoncestr(); payRequest.timeStamp = wxPayBean.getTimestamp(); payRequest.sign = wxPayBean.getSign(); //发起请求,调起微信前去支付 api.sendReq(payRequest); }

这里的WxPayBean 是自己写的一个请求参数的实体类:

public class WxPayBean {
    private String appid;//微信开放平台审核通过的应用APPID
    private String partnerid;//微信支付分配的商户号
    private String prepayid;//微信返回的支付交易会话ID
//        private String package;// 扩展字段 暂填写固定值Sign=WXPay
    private String noncestr;//随机字符串,随机字符串,不长于32位。推荐随机数生成算法
    private String sign;//签名,详见签名生成算法注意:签名方式一定要与统一下单接口使用的一致
    private String timestamp;//时间戳,请见接口规则-参数规定

   .......
}

3,微信支付结果回调在 {@link WXPayEntryActivity#onResp(BaseResp)}
只贴出该方法,具体类上面已经贴出:

/**
     * 处理结果回调
     *
     * @param resp
     */
    @Override
    public void onResp(BaseResp resp) {
        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);

        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {

            switch (resp.errCode) {
                case 0://支付成功
                    Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "onResp: resp.errCode = 0   支付成功");
                    break;
                case -1://错误,可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
                    Toast.makeText(this, "支付错误" + resp.errCode, Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "onResp: resp.errCode = -1  支付错误");
                    break;
                case -2://用户取消,无需处理。发生场景:用户不支付了,点击取消,返回APP。
                    Log.d(TAG, "onResp: resp.errCode = -2  用户取消");
                    Toast.makeText(this, "用户取消" + resp.errCode, Toast.LENGTH_SHORT).show();
                    break;

            }

            finish();//这里需要关闭该页面
        }

    }

附:微信支付Api

三、微信支付接入过程遇到的坑

1,支付不回调问题
如果获取不到支付回调,请检查一下WXPayEntryActivity放置的路径;微信支付必须要求该类的路径为:包名.wxapi.WXPayEntryActivity,不然不能回调。

2,申请App Id,应用签名的获取
如果接入有问题,请使用排查一下是否申请app id的时候,应用签名是否有误,推荐使用微信应用签名获取apk 来校验,填入自己应用包名即可查看应用签名。

3,在微信后台申请完app以后,注意监测是否获得微信支付的能力,需要单独申请
微信支付中,如果报appidmech_id(微信支付分配的商户号)的错,应该就是要支持支付功能的App的appid与商户平台的商户id不对应造成的。

Android 微信支付接入流程_第9张图片
微信支付的能力.png

附:检测是否安装微信app

   /**
     * 判断微信是否安装
     * @param context
     * @return true 已安装   false 未安装
     */
    public  static boolean isWxAppInstalled(Context context) {
        IWXAPI wxApi = WXAPIFactory.createWXAPI(context, null);
        wxApi.registerApp(Wx.APP_ID);
        boolean bIsWXAppInstalled = false;
        bIsWXAppInstalled = wxApi.isWXAppInstalled();
        return bIsWXAppInstalled;
    }

你可能感兴趣的:(Android 微信支付接入流程)