Android--快速接入微信支付

作者: Swy2w | 来源:发表于2017-08-02 18:04 被阅读1279次

    前言

    最近实习的时候要求我做支付模块,主要是介入支付宝支付和微信支付的。支付宝支付接入相对来说比较好做,官网文档也比较容易懂。但是做微信支付的时候,官网文档就有点懵逼了,不过慢慢读还是能够开通的。与是抽时间记录一下微信支付接入的过程。
    这里我不去说明AppID申请的过程,主要记录一下开发过程。

    微信支付

    首先一定要清楚微信支付业务流程,这样接下来就事半功倍了。
    主要官方文档看这:

    业务流程如下:


    微信支付业务流程

    这里我大致用自己的理解把App客户端的流程分为四步

    1、统一下单

    商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付。

    客户端将支付信息上传给公司服务端。首先根据具体公司的需求,上传支付信息给服务端,然后接收服务端还回结果。我们客户端只需要发送相应的请求提给服务端即可。
    更多具体内容参考微信APP支付文档-统一下单

    2、调起支付接口

    APP端调起支付的参数列表

    根据前一步得到的还回结果跳转至微信客户端进行支付操作

    3、用户进行微信支付操作

    进入微信支付页面后可以能会有:输入密码支付,取消支付,支付失败等操作

    4、微信客户端回调支付结果详情给我们的APP客户端

    完整示例

    1、引入微信支付资源

    1、引入微信支付依赖

    在build.gradle文件中,添加如下依赖即可:

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

    详情参考Android资源下载

    2、配置WXPayEntryActivity

    1、首先我们下载下来官网的demo然后copy其中的一个WXPayEntryActivity类放到 app包下新建一个wxapi包 里面。

    注意是WXPayEntryActivity不是WXEntryActivity,WXEntryActivity是微信分享的, WXPayEntryActivity才是支付的

    这个页面是在你调起微信支付完成支付(或取消或失败)后,再回到你的App时会调用的一个页面。请务必保证在你项目下他的结果目录为:
    开放平台绑定的商户应用包名 + wxapi + WXPayEntryActivity

    开放平台绑定的商户应用包名

    2、AndroidManifest.xml中注册

        <!--wx pay所需权限-->
        <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"/>
    
        <!--wx pay-->
        <activity
                android:name=".wxapi.WXPayEntryActivity"
                android:exported="true"
                android:launchMode="singleTop"/>
    

    3、发送支付信息给服务端

    跟服务端协调需要我们客户端传递什么信息过去。详细请求参数参考API列表-统一下单
    我这里,只需要传递一些和服务端协商好的数据,其他金额等都是在服务端处理好的。然后服务端还回预支付交易给我们客户端

            WXPayReq wxPayReq=new WXPayReq();
            wxPayReq.setUser_id(User_id);
            wxPayReq.setChannel_id(Channel_id);
            wxPayReq.setGoods_id(goodsID);
    

    3、跳转微信进行支付

    根据上面获取到的服务端的还回数据,调起微信支付,代码实例如下:

    @Override
        public void wxpay(Context context, WXPayRsp wxPayRsp, IPayListener iPayListener) {
            this.iPayListener = iPayListener;
            IWXAPI api= WXAPIFactory.createWXAPI(context, Constants.APP_ID);
            api.registerApp(Constants.APP_ID);
            PayReq payReq=new PayReq();
            payReq.appId=Constants.APP_ID;
            payReq.partnerId=wxPayRsp.getPartnerid();
            payReq.prepayId=wxPayRsp.getPrepayid();
            payReq.packageValue="Sign=WXPay";
            payReq.nonceStr=wxPayRsp.getNoncestr();
            payReq.timeStamp=wxPayRsp.getTimestamp();
            payReq.sign=wxPayRsp.getSign();
            api.sendReq(payReq);
        }
    

    具体请求参数如下:


    调起支付接口参数

    每次调用微信支付的时候都会校验 appid 、包名 和 应用签名的。 这三个必须保持一致才能够成功调起微信!!! (这个bug害我浪费一下午时间!api.sendReq接口,返回true,但微信客户端并未启动,后来产品给后台的appid和给我的不同才知道错误在这)

    4、微信客户端回调支付结果处理

    我是直接copy的官网demo里面WXPayEntryActivity类的,然后根据自己的需要删除了一些不必要的东西。其实我们可以安装微信官网给的demo和文档编写我们自己打WXPayEntryActivity,我的示例如下:

    public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
        
        private IWXAPI api;
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);
            try {
                api.handleIntent(getIntent(), this);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            
            setIntent(intent);
            api.handleIntent(intent, this);
        }
    
        @Override
        public void onReq(BaseReq req) {
        }
        
        @Override
        public void onResp(BaseResp resp) {
            int result = 0;
                   //有时候支付结果还需要发送给服务器确认支付状态
            if (resp.getType()== ConstantsAPI.COMMAND_PAY_BY_WX){
                if (resp.errCode==0){
                    Toast.makeText(this,"支付成功",Toast.LENGTH_LONG).show();
                }else if (resp.errCode==-2){
                    Toast.makeText(this,"取消支付",Toast.LENGTH_LONG).show();
                }else {
                    Toast.makeText(this,"支付失败",Toast.LENGTH_LONG).show();
                }
                finish();
            }
        }
    
    }
    

    errCode说明如下:

    名称 描述 解决方案
    0 成功 展示成功页面
    -1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
    -2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。

    填坑日记

    卸载重装微信或者清空数据保平安

    • 因为业务调整,公司微信接口改变,加上一些其他app的变更。发现之前明明好好通过支付的,结果出现了问题。还回错误为-1。后来换个测试机一搞就通过了,在测试机中引起微信支付失败的原因竟然是,缓存没有清空导致的。因为包名是一致,然后我的app里面还是用到了webview内嵌。心里有句mmp不知道当讲不当讲
    • 发正式宝的时候微信开发平台填写的签名改了之后,微信掉不起来,后来同样卸载微信就好了。这句mmp我一定要讲

    常见坑位收集

    Android微信支付彻底扫坑
    Android 微信支付详解与坑
    Android常见问题

    相关文章

      网友评论

      • 逐浪之鱼:特意登陆给你留言:感谢作者,每次调用微信支付的时候都会校验 appid 、包名 和 应用签名这句帮我省了很多时间~
      • tdjdyq:能不能提供一个Demo,搞了一天,还是调不起来android 微信客户端
      • 任飞:WXPayEntryActivity 这个列不需要配置 <intent-filter>么?
      • SuperZiLu:说实话 支付功能开发完成用了多久?

      本文标题:Android--快速接入微信支付

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