详细介绍Android开发集成微信支付(一) --- 仅客户端版
今日推荐
经常阅读博客是个好习惯
推荐鸿洋CSDN的博客
微信支付相关文章
详细介绍Android开发集成微信支付(一) --- 仅客户端版
详细介绍Android开发集成微信支付(二) --- 完整版本
引言
我的CSDN博客地址 (由于csdn的图片经常出现不显示问题,以后就在简书写博客了)
GitHub由于近期较忙,正加急整理中,敬请期待...
这一篇仅仅是我们Android客户端在微信支付需要做的事情(其实大部分是服务端做),如果想看完整的流程请看这一篇详细介绍Android开发集成微信支付(二) --- 完整版本
常用链接
微信开放平台 -- 注册并创建应用
微信支付SDK下载集成 -- 如何集成sdk
微信开放平台资源中心 -- 所有的资源
微信支付App开发文档 -- 微信支付的开发文档
微信支付业务流程 -- 里面有完成的支付流程
微信支付官方实例sample -- 下载官方示例
签名验证 -- 用于验证一下你代码生成的签名是否正确
这里有一个获取app签名工具的链接(签名工具下载地址) -- 用于获取打包后App的应用签名填写到开放平台上
开启微信支付
以购买商品类需求来说,我们客户端需要做的就是:
1.用户选择商品和数量CheckOut,提交给服务器端
2.然后用户填写订单相关信息,提交订单
3.客户端在提交订单之后,拿到服务器给的订单号,和微信启动需要的参数,调起微信支付
4.接受微信支付的本地回调,然后到自己的服务器轮询查询支付结果
一. 调起微信 *
已经最后一步了,我们马上就可以去验证是不是能够成功的调起微信并接收到微信支付的本地回调
调起微信支付,需要在开放平台设置包名和签名(这也是微信支付最大的一个坑,大部分人调不起微信基本都是这里的问题)
首先先看官方文档 的详细步骤
这里有一个获取签名工具的链接(签名工具下载地址 安装到手机上获取自己app的签名(打包之后安装到手机上)
这里只能是你在开放平台上填的签名的app才可以调起微信,比如我打包之后用上面的签名工具获取app的签名填入开放平台,所以想要测试微信支付需要打包安装到手机上才可以调起微信,如果发现没有调起微信就这样操作,虽然麻烦点,但是可以解决
//调起支付
try {
//一下所有的参数上面均获取到了
PayReq req = new PayReq();
req.appId = "你的APP_ID";
req.partnerId = "你的商户号";
req.prepayId = "你的prepayId";
req.nonceStr = "你的nonceStr";
req.timeStamp = "你的TimeStamp";
req.packageValue = "Sign=WXPay";
req.sign = "你的签名";
req.extData = "app data"; // optional
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
wxApi.sendReq(req);
} catch (Exception e) {
Log.e("PAY_GET", "异常:" + e.getMessage());
}
到这里正常情况下肯定可以调起微信支付 ,如果出现了问题 1.签名问题(去上面验证下自己的签名) 2.应用签名问题请参考(3.2.3 调起微信 也就是上面)
二. 接受微信支付的回调
到这一步说明你的微信已经成功调起,这里接受微信支付的回调
我们需要在应用的包名下建立wxapi的包名然后将实例中的WXPayEntryActivity.java复制过来
记住一定是项目的包名下建立wxapi包然后复制过来
然后再AndroidManifest中添加
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
在WXPayEntryActivity中就可以接受回调了
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//这里可以不给布局,也可以给个透明或者loading框 根据项目的需求
setContentView(R.layout.act_pay);
api = WXAPIFactory.createWXAPI(this, APP_ID);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
以上两个微信已经写好,接下来是微信回调的方法
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
//根据下面的errCode表中 switch一下即可
//如果是0的话,就是成功,然后这里去服务器查询具体的支付结果,注意服务器查询的支付结果才是可靠地支付结果
}
}
回调结果码
支付回调可能遇到的问题:
1.如果项目中存在两种即以上的支付(比如:商城购买 和 普通的打赏支付 或者其他),两种支付完成后都会回调onResp但是之后的逻辑不一样,所以我们需要手动的区分两种支付(比如在支付前可以存一个变量标识)
2.支付成功回调之后,也就是errCode = 0 的时候,我们需要去服务器查询结果,一般会需要给他们订单号去查询,但是微信回调之后不会给你订单号,所以也需要你去本地存一下(或者其他更好的方式)
到这里微信支付就集成完了,当然代码很粗糙可以在具体的细节细化,当然有其他更好的方式也可以提意见优化
希望这篇文章可以帮助到需要的人,如果还有其他问题或者补充可以联系我~~~