Android集成微信支付

来源:互联网 发布:skype官方下载 mac 编辑:程序博客网 时间:2024/05/18 18:20

自己也是第一次在项目中集成微信支付,所以中途遇到了一些问题,记录下来希望能帮助到其他小伙伴。

微信集成其实在解决完所有问题之后发现还是挺简单的,主要是官方文档给的东西不足以让我们很完整的去集成,中途查阅了很多其他小伙伴的博客才集成成功,由于我的项目中微信集成已经有一段时间了,所以没有能记录下对我有过帮助的博客地址,在此还是对那些坚持写博客帮助过我们的人表示感谢。

好了,切入正题。大家可以先看一下整个微信支付的逻辑,


微信支付的官方文档前面描述的还是比较清楚,我主要说一下有几个文档不是很清晰的地方

1.申请APPID

这个不用过多描述,大家主要是要注意要用公司的账号去申请,或者让管理申请好发给你就行了。

2.引入微信支付jar包,注册APPID

如果小伙伴们项目中已经集成了友盟分享的话,就可以不用再次重复引入,因为友盟分享里面已经有微信支付的jar包了。

在APP中注册APPID的时候可以是在onCreate方法中,也可以是在你调起支付接口的时候,但是如果想要在onCreate方法中注册的话必须是你已经拿到APPID,这个APPID也可以是后台传给你的,也可以自己手动写成字符串。

3.调起支付

在调起支付的时候需要的很多参数

  1. IWXAPI api;
  2. PayReq request = new PayReq();
  3. request.appId = "wxd930ea5d5a258f4f";
  4. request.partnerId = "1900000109";
  5. request.prepayId= "1101000000140415649af9fc314aa427",;
  6. request.packageValue = "Sign=WXPay";
  7. request.nonceStr= "1101000000140429eb40476f8896f4c9";
  8. request.timeStamp= "1398746574";
  9. request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
  10. api.sendReq(req);

如果还想在其中加入判断用户是否安装微信客户端的话,可以添加一些代码

  1. if(wxapi.isWXAppInstalled()&&wxapi.isWXAppSupportAPI()){
  2. SPHelper.putString(PayTypeChoiceActivity.this,"order_id",order_id);
  3. wxapi.sendReq(request);
  4. }else{
  5. Toast.makeText(PayTypeChoiceActivity.this,"请安装微信客户端",Toast.LENGTH_SHORT).show();
  6. }

其中appId 、packageValue是不变的,可以写死,当然也可以是后台将这些参数一并传给你。

4.支付回调

这里会是很多人一头雾水的地方,看下图:


图1 微信支付回调文档说明

其中的两个坑,我给大家已经圈出来了,微信这点是非常的霸气,你必须在你的项目路径下,创建一个名字为wxapi的文件夹,然后在该文件中创建一个名字必须为WXPayEntryActivity的Activity并且实现IWXAPIEventHandler接口,并实现接口中的方法,这两个方法就是接收回调的方法了。

在这个WXPayEntryActivity中你可以加载你自己搭好的布局,你们想怎样提示用户支付结果就怎么搭界面,但里面应该有一个TextView来提示支付成功、支付失败或者取消支付。此时你还需要注意几个点:

a.WXPayEntryActivity在AndroidManifest中注册的时候,需要使用全路径,如com.XXX.XXX.wxapi.WXPayEntryActivity,还有就是需要设置两个属性

  1. android:exported="true"
  2. android:launchMode="singleTop"

b.在WXPayEntryActivity的onCreate方法中需要设置


  1. // 通过WXAPIFactory工厂,获取IWXAPI的实例
  2. api = WXAPIFactory.createWXAPI(this, Constant.WX_APP_ID, false);
  3. // 将该app注册到微信
  4. api.registerApp(Constant.WX_APP_ID);
  5. api.handleIntent(getIntent(), this);

其次,需要实现

  1. @Override
  2. protected void onNewIntent(Intent intent) {
  3. super.onNewIntent(intent);
  4. setIntent(intent);
  5. api.handleIntent(intent, this);
  6. }

c.在onResp方法中根据baseResp.errCode来获取回调的值,值的含义已经在图1中有展示,在此就不再赘述。这里需要注意的就是图1中圈出来的第二个坑点,其实也不算是坑点,主要是微信让我们以我们自己的后台支付结果为准,因为有可能微信那边提示支付成功,但是我们自己的后台却还没有到账的情况。所以最好还是让后台提供一个接口给你,供你查询支付情况。errCode为0的时候先不着急提示用户,而是先去我们的后台查询一次是否支付成功,如果我们的后台提示支付成功,再向用户展示,这样只是确保万一。

  1. @Override
  2.     public void onResp(BaseResp baseResp) {
  3.         if (baseResp.errCode == 0) {
  4.             String order_id = SPHelper.getString(WXPayEntryActivity.this, "order_id", "");
  5.     // 请求我们的服务器支付结果
  6.             checkSattus("mobile_payment","order_state",order_id);
  7.         } else if (baseResp.errCode == -1) {
  8.             pay_result_txt.setText("已取消支付");
  9.         } else if (baseResp.errCode == -2) {
  10.             pay_result_txt.setText("支付失败");
  11.         }
  12.     }

这里面大家应该会注意到一点就是我使用了SharePreference来获取order_id,查询我们的后台是通过传order_id参数给他们,但是我们这个Activity中我没有找到其他的方法来获取到该订单的订单号,所以我就出此下策,当你点击微信支付的时候,将order_id保存到SharePreference中,在回调里面需要用到的时候再获取,当然这存在一定的安全隐患,因为SharePreference是以文件的形式保存到本地的,容易被篡改。当然也可以使用全局变量来保存,如果有知道如何直接获取到order_id的话,请联系我,非常感谢。


好了,到这里微信支付就已经集成完成了,如果有遗漏的地方还请大家指出来,在下方留言,我看到定会及时回复。谢谢大家!


最后附上微信支付的官方文档点击链接

1 0
原创粉丝点击