1、首先到 [ 微信开放平台官网] 申请注册帐号,这些流程就忽略了到官网一看自然就知道怎么走,感觉在这里没有必要说很多。
2、申请一个移动应用,填写完成你的应用信息。其他的没啥,最主要的是要填对你的签名和包名,否则SDK调不起来。包名大家都懂,主要是这个签名的过程需要提醒一下:
1)签名全部是小写,没有大写。
2)签名填的是MD5,不是SHA1更不是SHA256,有的同学不小心就搞错了
这里获取应用签名的方法有二。
第一个方法:先假设我们的应用已经有签名文件了(这里就不讲解生成签名文件的过程了,Android Studio提供的生成签名文件的方法已经很简单了,这里不赘述)。在命令行输入以下命令:
keytool -list -v -keystore 目标签名文件路径
然后输入一下签名文件的密码后就出来很多签名文件的信息:
注意是复制出里面的指纹证书下的MD5那一串。
然后自己手动把大写字母改成小写字母,并且把冒号都去掉。这样子就得到了签名。
第二个方法:简单粗暴,微信开放平台提供给我们一个签名获取的工具,点击这里跳转
然后把apk安装到手机后,正确输入你的应用包名后就获取到了一串签名:
把这串签名填写到你申请的应用配置里面。
搞定,等待微信审核。
可以直接到官网下载jar包或者配置依赖:
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
或者
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
(其中,前者包含统计功能)
然后我们添加如下权限:
**
**
微信官网的API列表,戳这里: 微信开放平台官网 统一下单接口
这个下单的接口一定要放在后台来完成的,虽然微信没有限制不能在客户端完成。
在这一步的时候一定要让后台开发人员去对接这个接口的数据。然后让他给你返回以下这几个必要的数据:
数一数,总共是7个数据。一定要让后台走完统一下单的接口后,把这7个数据返回来。
其中:
appid应用id: 是你申请应用后就有的
partnerid商户号:是需要你向微信注册企业商户后得到的商户号
prepayid 预付单号:是走统一下单的接口后,微信返回的一个预支付单号
package 扩展字段:这个字段暂时没啥用,微信是让我们填写固定值Sign=WXPay就行
noncestr随机字符串:这个是后台自己随便生成的一个随机字符串,但是不要超过32位,微信官方提供给了我们一个随机生成算法。
timestamp时间戳: 没啥好说
sign签名:这个最好也是让后台参考微信提供给我们的 签名生成算法
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的这个对象里。然后创建一个新的子线程来启动这个任务
说了这么多,想必你已经能调起微信进行支付了吧。接下来说一下微信支付的回调,
微信的回调有四大坑,这里通过踩坑的方式来完成示例:
1、新建WXPayEntryActivity(坑一:新建的WXPayEntryActivity类包名路径不对)
长话短说,这里千言万语融成一句话:一定要在建立一个 包名.wxapi.WXPayEntryActivity
比如你的包名是:com.example.demo。那么你就得配置一个com.example.demo.wxapi.WXPayEntryActivity
千万要注意,不要随便乱放这个Activity,也不能改名,就叫WXPayEntryActivity。包名跟你申请应用的时候填写的包名一致。
2、向AndroidManifest.xml注册WXPayEntryActivity(坑二:没有配置android:exported=“true”)
注意看清楚没?多配置了一个 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);