Android集成微信支付

转载请注明出处: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);方法之前还是之后,如果是在此之后,应该只会出现布局文件中的初始状态。

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

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值