Android App接入支付功能——微信篇

作者: Jsonjia | 来源:发表于2018-01-29 17:20 被阅读204次

    支付宝支付,请参考我另一篇:Android App接入支付功能——支付宝篇

    老样子,上效果图由于涉及到输入密码,我分开了

    微信支付.gif 微信支付.gif

    比起支付宝支付,相对来说微信支付更麻烦一点,原因有三:
    ①官方文档写的不详细,还有错别字,容易误导;
    ②开启微信支付,还需要300RMB(让个人开发者止步);
    ③每次测试支付必须打包(AS中配置gradle debug和release签名一样除外)

    大概说下思路,整体来说,和支付宝一致的:
    1.微信商户接入准备工作
    2.微信支付sdk开发文档
    3.微信支付sdk详细流程

    步骤:
    1.登录微信官网,进行登录,并创建应用,创建成功得到AppID,如下:

    应用.png

    2.集成微信支付sdk到AS中,有两种方式,请选一种即可,随意:
    ①手动集成方式(笔者这里用的是这种方式):
    下载官方sdk,将sdk放入自己工程libs文件中:

    libs目录.png

    ②自动集成方式(推荐):
    在build.gradle文件中,添加如下依赖即可:

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

    或者

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

    (前者包含统计功能)如果不需要统计,可选第二种方式。到这里微信支付集成完成。

    3.调起微信支付:
    在调用支付接口之前,先简单介绍下工程结构以及相关类代表含义,相比支付宝,比支付宝类少一点:

     src
      ├── com.你的包名.activity
      |   ├── XXActivity.java  //在这里我们启动支付接口
      ├── com.你的包名.wxapi   //这里一定要注意wxapi不可随意起名,而且必须在包名下一级目录里面
      |   ├── WxPayConfig.java //app_id信息
      |   ├── WXPayEntryActivity.java //微信支付成功后,执行该类
      └── ...
    

    这里注意一点:微信支付一些下订单都是由服务器返回的,这一点跟支付宝不同

    ①下单(服务端做):根据微信官方的话来说是为了安全;
    ②调用接口:在我们自己的APP中点击微信支付按钮后,我们首先要请求一个我们自己服务端的接口,这时服务端需要走统一下单的逻辑,然后将一些参数返回给我们。

    相关类代码:


    代码图.png

    从图中可以看到,我们传了2个参数:上下文和oT,oT是由后台返回的,格式为

       /**
        * appid : wxa694a8105b02619a
        * code : RE1513750758639793
        * noncestr : NONCE1513750758880-1-1-1-1
        * package : Sign=WXPay
        * partnerid : 1494228292
        * prepayid : wx2017122014192124c6b22af30750915188
        * sign : 4A320D2B2EBFCD7BCF95698BB5D7C192
        * timestamp : 1513750758
        */
    

    可以看到返回这些参数,正好符合微信官方要求的参数。好,请看下面代码

    /**
     * Created by zjp on 2017/12/21 10:46.
     * 支付宝和微信支付工具类
     */
     public class PaymentHelper {
         /**
          * 微信支付
          */
         public void startWeChatPay(Activity activity, PayReponse payReponse) {
             if (activity == null || payReponse == null) 
                  return;
             if (!WxPayConfig.APP_ID.equals(payReponse.getAppid())) 
                  return;
              
             IWXAPI wxapi = WXAPIFactory.createWXAPI(activity, WxPayConfig.APP_ID, true);
             // 将该app注册到微信
             wxapi.registerApp(WxPayConfig.APP_ID);
             if (!wxapi.isWXAppInstalled()) {
                   HongshiUtil.showToast("你没有安装微信");
                   return;
             }
             //我们把请求到的参数全部给微信
             PayReq req = new PayReq(); //调起微信APP的对象
             req.appId = WxPayConfig.APP_ID;
             req.partnerId = payReponse.getPartnerid();
             req.prepayId = payReponse.getPrepayid();
             req.nonceStr = payReponse.getNoncestr();
             req.timeStamp = payReponse.getTimestamp();
             req.packageValue = payReponse.getPackageX(); //Sign=WXPay
             req.sign = payReponse.getSign();
      
             wxapi.sendReq(req); //发送调起微信的请求
         }
     }
    

    WxPayConfig.java:

    /**
     * Created by zjp on 2017/12/20 11:28.
     */
      public class WxPayConfig {
    
           /** 微信支付 APP_ID */
           public static final String APP_ID = "XXXXXXXXX";//填写你自己的appId
      }
    

    处理微信支付的回调
    微信支付后,就会在WXPayEntryActivity类中处理,需要实现IWXAPIEventHandler接口,这个接口会要求你实现onResp方法,我们就在这个方法中处理回调。
    WXPayEntryActivity.java:

    public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler {
          private IWXAPI iwxapi;
          @Override
          protected int getInflaterLayout() {
              return R.layout.pay_result;
          }
    
          @Override
          protected void initView() {
             super.initView();
    
             wxCode = PreferenceUtils.getInstance().getPayCode();
             iwxapi = WXAPIFactory.createWXAPI(this, WxPayConfig.APP_ID, true);
             iwxapi.handleIntent(getIntent(), this);
          }
    
           @Override
           protected void onNewIntent(Intent intent) {
               super.onNewIntent(intent);
               setIntent(intent);
               iwxapi.handleIntent(intent, this);
           }
    
            @Override
            public void onReq(BaseReq req) {
            }
    
            @Override
            public void onResp(BaseResp resp) {
                Log.d("zjp", "onPayFinish, errCode = " + resp.errCode);// 支付结果码
                /**
                 * 结果码参考:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
                 */ 
                 if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
                         int code = resp.errCode;
                         switch (code) {
                               case 0:
                                    showToast("支付成功");
                               break;
                               case -1:
                                     finish();
                                     // 支付失败 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
                                     showToast("支付失败");
                                break;
                               case -2:
                                     finish();
                                     showToast("支付取消");
                                break;
                         }
                 }
             }
      }
    

    到这里微信支付代码完成!

    希望可以帮助大家
    如果哪里有什么不对或者不足的地方,还望读者多多提意见或建议!

    相关文章

      网友评论

      • 我爱莎莉:楼主,问一下,所谓下单在服务端做是什么意思?
        我爱莎莉:@Jsonjia 是不是官方文档里面的调用统一下单接口那里?
        Jsonjia:就是当我们点击启动微信支付时候,调后台给的接口,这个接口包括微信的订单号,id和金额等
      • 562f517183d1:initView里的wxCode 报错啊,getInflaterLayout 里的布局是什么,不写getInflaterLayout和initView可以调用么,我不写getInflaterLayout和initView,点击支付,不跳转也不报错,楼主求解
        Jsonjia:@Rush丶阿乐 解决就好
        562f517183d1:@Jsonjia 已经解决,
        1.在Debug版里的签名和发布版的签名不同,在开放平台注册的签名是发布版的签名。
        2.在开放平台注册的签名不能带“ : ”。
        3.要在工程文件中给 WXPayEntryActivity 进行注册,还需要添加
        android:exported="true" ---- 允许被其他应用调用
        android:launchMode="singleInstance"
        4.在使用Debug版本失败后,微信留有缓存,需要清除微信缓存或卸载微信后重新安装微信,再安装发布版。
        Jsonjia:有错误log吗?
      • AwaitZhang:这两篇支付的文章写的很好,收藏了
        Jsonjia:@AwaitZhang 互相学习:+1:

      本文标题:Android App接入支付功能——微信篇

      本文链接:https://www.haomeiwen.com/subject/xlixzxtx.html