Android开发知识(十二):30分钟快速接入微信支付SDK

版权声明:本文为博主原创文章,未经博主允许不得转载,如若需要转载请注明原文出处以及作者。 https://blog.csdn.net/lc_miao/article/details/79867140

一、申请应用


1、首先到 [ 微信开放平台官网] 申请注册帐号,这些流程就忽略了到官网一看自然就知道怎么走,感觉在这里没有必要说很多。
2、申请一个移动应用,填写完成你的应用信息。其他的没啥,最主要的是要填对你的签名和包名,否则SDK调不起来。包名大家都懂,主要是这个签名的过程需要提醒一下:
1)签名全部是小写,没有大写。
2)签名填的是MD5,不是SHA1更不是SHA256,有的同学不小心就搞错了
这里获取应用签名的方法有二。

第一个方法:先假设我们的应用已经有签名文件了(这里就不讲解生成签名文件的过程了,Android Studio提供的生成签名文件的方法已经很简单了,这里不赘述)。在命令行输入以下命令:

keytool -list -v -keystore 目标签名文件路径

然后输入一下签名文件的密码后就出来很多签名文件的信息:
签名
注意是复制出里面的指纹证书下的MD5那一串。
然后自己手动把大写字母改成小写字母,并且把冒号都去掉。这样子就得到了签名。

第二个方法:简单粗暴,微信开放平台提供给我们一个签名获取的工具,点击这里跳转
这里写图片描述
然后把apk安装到手机后,正确输入你的应用包名后就获取到了一串签名:
这里写图片描述

把这串签名填写到你申请的应用配置里面。

搞定,等待微信审核。

二、配置微信支付的SDK


可以直接到官网下载jar包或者配置依赖:

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

或者

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

(其中,前者包含统计功能)

然后我们添加如下权限:


<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

三、微信支付流程


**

1、统一下单接口


**
微信官网的API列表,戳这里: 微信开放平台官网 统一下单接口

这个下单的接口一定要放在后台来完成的,虽然微信没有限制不能在客户端完成。
在这一步的时候一定要让后台开发人员去对接这个接口的数据。然后让他给你返回以下这几个必要的数据:
这里写图片描述
数一数,总共是7个数据。一定要让后台走完统一下单的接口后,把这7个数据返回来。
其中:
appid应用id: 是你申请应用后就有的
partnerid商户号:是需要你向微信注册企业商户后得到的商户号
prepayid 预付单号:是走统一下单的接口后,微信返回的一个预支付单号
package 扩展字段:这个字段暂时没啥用,微信是让我们填写固定值Sign=WXPay就行
noncestr随机字符串:这个是后台自己随便生成的一个随机字符串,但是不要超过32位,微信官方提供给了我们一个随机生成算法。
timestamp时间戳: 没啥好说
sign签名:这个最好也是让后台参考微信提供给我们的 签名生成算法

2、APP调起支付接口


private IWXAPI iwxapi; //微信支付api
 /**
 *调起微信支付的方法
 **/
 private void toWXPay() {
        iwxapi = WXAPIFactory.createWXAPI(this, null); //初始化微信api
        iwxapi.registerApp(appid); //注册appid 
		//一定注意要放在子线程
        Runnable payRunnable = new Runnable() {  
            @Override
            public void run() {
                PayReq request = new PayReq(); //调起微信的对象
                //这几个参数的值,正是上面我们说的统一下单接口后返回来的字段,我们对应填上去即可
                request.appId = appid;
                request.partnerId = partnerId;
                request.prepayId = prepayId;
                request.packageValue = "Sign=WXPay";
                request.nonceStr = nonceStr;
                request.timeStamp = timeStamp;
                request.sign = sign;
                iwxapi.sendReq(request);//发送调起微信的请求
            }
        };
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

正常来讲,到这里就可以调起微信了。在前面我们通过后台去走微信的统一下单接口后,后台给我们返回的几个参数,正好填写在PayReq的这个对象里。然后创建一个新的子线程来启动这个任务

3、微信支付的回调


说了这么多,想必你已经能调起微信进行支付了吧。接下来说一下微信支付的回调,
微信的回调有四大坑,这里通过踩坑的方式来完成示例:
1、新建WXPayEntryActivity(坑一:新建的WXPayEntryActivity类包名路径不对)
长话短说,这里千言万语融成一句话:一定要在建立一个 包名.wxapi.WXPayEntryActivity
比如你的包名是:com.example.demo。那么你就得配置一个com.example.demo.wxapi.WXPayEntryActivity
千万要注意,不要随便乱放这个Activity,也不能改名,就叫WXPayEntryActivity。包名跟你申请应用的时候填写的包名一致。

2、向AndroidManifest.xml注册WXPayEntryActivity(坑二:没有配置android:exported=“true”)

  <activity android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"
            ></activity>

注意看清楚没?多配置了一个 android:exported=“true”,这个属性代表着运行被外界程序所启动这个Activity,微信对于我们的app来说就是外部程序了,要回调我们的Activity,没有这个万万不行。千万要注意

3、实现IWXAPIEventHandler接口,注册API(坑三:没有在onCreate里注册API)
这个接口有两个方法:

@Override
    public void onReq(BaseReq baseReq) {
        
    }

    @Override
    public void onResp(BaseResp baseResp) {

    }

分别是我们做出的请求和请求的结果回调。我们的业务逻辑便是从onResp方法里写的
然后一定要 千万要 万万要注册api、八成没有接收到回调的同学们就是没有这一步:

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //注册API 没有这个不会执行onResp
        api = WXAPIFactory.createWXAPI(this, WXModel.APP_ID);
        api.handleIntent(getIntent(), this);
        LogUtils.i(TAG, " handleIntent:" + api.handleIntent(getIntent(), this));
    }

4、在onResp方法里编写支付后的回调处理逻辑(坑四:回调处理逻辑搞错)
其实到这一步回调就可以完成了。剩下的是我们的回调回来页面后的业务逻辑,从onResp来处理。
通过baseReq.getType()可以得到回调的类型,在ConstantsAPI接口里面定义了微信回调的很多类型,需要我们自己来区分
这里写图片描述
微信支付的回调类型是:ConstantsAPI.COMMAND_PAY_BY_WX

然后通过状态码:resp.errCode 来得知支付的结果(成功、失败、取消等等),正常成功的话是resp.errCode==BaseResp.ErrCode.ERR_OK,取消支付是BaseResp.ErrCode.ERR_USER_CANCEL。

好了,到这一步的时候我们就绕过这么多个坑,基本做对的话就能成功支付并且回调支付结果。

最后,由于微信的回调机制,我们没办法做出其他处理,一定只能通过在固定的包名路径下新建这个类来完成回调,如果你实在不想微信显示这个页面的话,那么也可以通过广播、或者EventBus来吧结果回调出去,然后结束页面。这样子注册了广播接收或者EventBus的Actibity就能接收到回调的结果:

 @Override
    public void onResp(BaseResp baseResp) {
        if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            Intent intent = new Intent("PAY_BY_WX_ACTION");
            intent.putExtra("errCode", baseResp.errCode);
            sendBroadcast(intent);
            finish();
        }
    }

四、总结


微信支付其实没有啥东西,主要是后台会比较麻烦一些,因为后台跟微信对接的数据特别多,而后台跟Android端对接的就比较简单了。

在我们的APP里面通常有好多处地方需要调起微信支付,所以不妨把统一下单的接口封装成实体对象,然后吧这个对象传递给wxPay去调起支付。提供一个WXModel类,把wxaPay的方法写在Model里面。

另外,微信还给我们提供了一系列的API列表,感兴趣的同学页可以去了解一下,不过这些API都是相对于后台来说的,对于客户端来说,还是要再经过后台封装一层接口来间接获取关于微信支付的信息。

比如申请退款、取消关闭订单、退款结果通知等等,主要的任务还是需要后台来完成的。

最后,有几点要说明一下:
1、申请应用时的配置签名一定要MD5、小写、不要带冒号,最好用官方给的签名获取工具。
2、一定要注意WXPayEntryActivity的包名路径是否正确,已经配置export="true"的属性
3、一定注意要在WXPayEntryActivity的onCreate里面注册API并且调用 api.handleIntent(getIntent(), this);

猜你喜欢

转载自blog.csdn.net/lc_miao/article/details/79867140