转载请注明出处:blog.csdn.net/wll995806658
自己也是第一次在项目中集成微信支付,所以中途遇到了一些问题,记录下来希望能帮助到其他小伙伴。
微信集成其实在解决完所有问题之后发现还是挺简单的,主要是官方文档给的东西不足以让我们很完整的去集成,中途查阅了很多其他小伙伴的博客才集成成功,由于我的项目中微信集成已经有一段时间了,所以没有能记录下对我有过帮助的博客地址,在此还是对那些坚持写博客帮助过我们的人表示感谢。
好了,切入正题。大家可以先看一下整个微信支付的逻辑,
微信支付的官方文档前面描述的还是比较清楚,我主要说一下有几个文档不是很清晰的地方
1.申请APPID
这个不用过多描述,大家主要是要注意要用公司的账号去申请,或者让管理申请好发给你就行了。
2.引入微信支付jar包,注册APPID
如果小伙伴们项目中已经集成了友盟分享的话,就可以不用再次重复引入,因为友盟分享里面已经有微信支付的jar包了。
在APP中注册APPID的时候可以是在onCreate方法中,也可以是在你调起支付接口的时候,但是如果想要在onCreate方法中注册的话必须是你已经拿到APPID,这个APPID也可以是后台传给你的,也可以自己手动写成字符串。
3.调起支付
在调起支付的时候需要的很多参数
IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";
request.partnerId = "1900000109";
request.prepayId= "1101000000140415649af9fc314aa427",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
api.sendReq(req);
如果还想在其中加入判断用户是否安装微信客户端的话,可以添加一些代码
if(wxapi.isWXAppInstalled()&&wxapi.isWXAppSupportAPI()){
SPHelper.putString(PayTypeChoiceActivity.this,"order_id",order_id);
wxapi.sendReq(request);
}else{
Toast.makeText(PayTypeChoiceActivity.this,"请安装微信客户端",Toast.LENGTH_SHORT).show();
}
其中appId 、packageValue是不变的,可以写死,当然也可以是后台将这些参数一并传给你。
4.支付回调
这里会是很多人一头雾水的地方,看下图:
图1 微信支付回调文档说明
其中的两个坑,我给大家已经圈出来了,微信这点是非常的霸气,你必须在你的项目路径下,创建一个名字为wxapi的文件夹,然后在该文件中创建一个名字必须为WXPayEntryActivity的Activity并且实现IWXAPIEventHandler接口,并实现接口中的方法,这两个方法就是接收回调的方法了。
在这个WXPayEntryActivity中你可以加载你自己搭好的布局,你们想怎样提示用户支付结果就怎么搭界面,但里面应该有一个TextView来提示支付成功、支付失败或者取消支付。此时你还需要注意几个点:
a.WXPayEntryActivity在AndroidManifest中注册的时候,需要使用全路径,如com.XXX.XXX.wxapi.WXPayEntryActivity,还有就是需要设置两个属性
android:exported="true"
android:launchMode="singleTop"
b.在WXPayEntryActivity的onCreate方法中需要设置
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(this, Constant.WX_APP_ID, false);
// 将该app注册到微信
api.registerApp(Constant.WX_APP_ID);
api.handleIntent(getIntent(), this);
其次,需要实现
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
c.在onResp方法中根据baseResp.errCode来获取回调的值,值的含义已经在图1中有展示,在此就不再赘述。这里需要注意的就是图1中圈出来的第二个坑点,其实也不算是坑点,主要是微信让我们以我们自己的后台支付结果为准,因为有可能微信那边提示支付成功,但是我们自己的后台却还没有到账的情况。所以最好还是让后台提供一个接口给你,供你查询支付情况。在errCode为0的时候先不着急提示用户,而是先去我们的后台查询一次是否支付成功,如果我们的后台提示支付成功,再向用户展示,这样只是确保万一。
@Override
public void onResp(BaseResp baseResp) {
if (baseResp.errCode == 0) {
String order_id = SPHelper.getString(WXPayEntryActivity.this, "order_id", "");
// 请求我们的服务器支付结果
checkSattus("mobile_payment","order_state",order_id);
} else if (baseResp.errCode == -1) {
pay_result_txt.setText("支付失败");
} else if (baseResp.errCode == -2) {
pay_result_txt.setText("已取消支付");
}
}
这里面大家应该会注意到一点就是我使用了SharePreference来获取order_id,查询我们的后台是通过传order_id参数给他们,但是我们这个Activity中我没有找到其他的方法来获取到该订单的订单号,所以我就出此下策,当你点击微信支付的时候,将order_id保存到SharePreference中,在回调里面需要用到的时候再获取,当然这存在一定的安全隐患,因为SharePreference是以文件的形式保存到本地的,容易被篡改。当然也可以使用全局变量来保存,如果有知道如何直接获取到order_id的话,请联系我,非常感谢。
遇到过的问题汇总:(注意,所有的微信分享,支付等功能测试都需要打包安装才能正常跑起来,如果大家是直接build进真机,发现跑不起来的,请先打包安装进行测试)
1.不回调到WXPayEntryActivity界面
产生这个问题的原因有很多可能,第一种可能是并没有按照文档要求放置WXPayEntryActivity.java文件到包名.wxapi.WXPayEntryActivity这个完整目录下;第二种可能是没有在WXPayEntryActivity界面onCreate和onNewIntent方法中调用相应handleIntent;第三种,也是我粗心大意翻过的错误,没有在配置文件中声明该Activity。
2.回调到WXPayEntryActivity界面但是没有执行回调onResp方法
我自己遇到过的情况是:项目中集成了ShareSDK微信分享,所以粗心的自己导了微信支付包的之后,调起微信支付和回调页面导入的IWXAPI及其他相关类路径来自于两个不同的sdk,导致无法正确回调。大家如果遇到这个问题可以检查一下。
3.在onResp方法中根据返回errorCode执行更新UI操作不成功
大家如果遇到这个问题,请先检查一下初始化UI的方法是在api.handleIntent(getIntent(), this);方法之前还是之后,如果是在此之后,应该只会出现布局文件中的初始状态。
好了,到这里微信支付就已经集成完成了,如果有遗漏的地方还请大家指出来,在下方留言,我看到定会及时回复。谢谢大家!
最后附上微信支付的官方文档点击链接