Android集成微信支付
来源:互联网 发布:skype官方下载 mac 编辑:程序博客网 时间:2024/05/18 18:20
自己也是第一次在项目中集成微信支付,所以中途遇到了一些问题,记录下来希望能帮助到其他小伙伴。
微信集成其实在解决完所有问题之后发现还是挺简单的,主要是官方文档给的东西不足以让我们很完整的去集成,中途查阅了很多其他小伙伴的博客才集成成功,由于我的项目中微信集成已经有一段时间了,所以没有能记录下对我有过帮助的博客地址,在此还是对那些坚持写博客帮助过我们的人表示感谢。
好了,切入正题。大家可以先看一下整个微信支付的逻辑,
微信支付的官方文档前面描述的还是比较清楚,我主要说一下有几个文档不是很清晰的地方
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的话,请联系我,非常感谢。
好了,到这里微信支付就已经集成完成了,如果有遗漏的地方还请大家指出来,在下方留言,我看到定会及时回复。谢谢大家!
最后附上微信支付的官方文档点击链接
- android集成微信支付
- android集成微信支付
- Android 微信支付集成
- android集成微信支付
- Android集成微信支付
- Android微信支付集成
- Android集成微信支付
- Android集成微信支付
- Android 集成微信支付
- Android集成微信支付
- Android集成微信支付
- android集成微信支付
- Android集成微信支付
- Android集成微信支付
- Android 微信支付集成
- Android 集成微信支付
- android集成支付,支付宝,微信
- Android 集成微信支付V3
- C语言动态内存分配
- js 文本框自动补全功能,异步加载数据,调试成功的
- MicroSoft Visual Studio 2013 社区版下载地址
- RxJava 驯服数据流之组合数据流
- centOS升级内核
- Android集成微信支付
- STC89C52单片机RAM模式
- QT代开文件的默认路径QFileDialog::getOpenFileName ()
- RxJava 驯服数据流之时间平移
- bzoj2190【线性筛】
- RxJava 驯服数据流之 hot & cold Observable
- android在hal下 如何获得对一个内核节点的访问权限
- angular2实现图片轮播
- Tomcat服务器顶层结构和启动过程