集成QQ钱包---踩坑
来源:互联网 发布:看韩国电影软件 编辑:程序博客网 时间:2024/05/17 00:01
很多在在做支付宝支付,微信支付的时候都会踩到各种坑,但,踩的人多了后面的人就越发的顺利,现在做支付宝和微信支付很顺利的就完成,但是,QQ钱包我相信很多人很多项目都不会集成进去吧,我就遇到个这么需求,做了这么多支付的我本来是很简单的就完成了客户端部分,并且按照demo在客户端进行签名并唤起了QQ,ok。成功,但,签名大家都知道是在服务端签名,接下来坑就来了。
坑1:
那句要属QQ钱包的开发文档了,
https://qpay.qq.com/qpaywiki/showdocument.php?pid=38&docid=165这里是Android集成文档,你会在最下面看见:
这才是应该用到的签名,但是被放在了android文档下面,后台哥们儿咋个找得到,所以搞成了支付签名(统一下单里面),所以一直报签名错误,好不容易才联系到了QQ钱包团队,捣鼓了半天,说了各种问题,签名错误请核对:appid,appkey(记住,唤起钱包的签名一定是用的appkey),和签名算法,qq钱包要求HMAC-SHA1,不是MD5,所以不要搞错。似乎知道了这个文档坑后QQ钱包那边的人应该去修改文档去了。
客户端签名的代码:
/** * 签名步骤建议不要在app上执行,要放在服务器上执行. */public void signApi(PayApi api) throws Exception { // 按key排序 StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("appId=").append(api.appId); stringBuilder.append("&bargainorId=").append(api.bargainorId); stringBuilder.append("&nonce=").append(api.nonce); stringBuilder.append("&pubAcc=").append(""); stringBuilder.append("&tokenId=").append(api.tokenId); byte[] byteKey = (APP_KEY+"&").getBytes("UTF-8"); // 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称 SecretKey secretKey = new SecretKeySpec(byteKey, "HmacSHA1"); // 生成一个指定 Mac 算法 的 Mac 对象 Mac mac = Mac.getInstance("HmacSHA1"); // 用给定密钥初始化 Mac 对象 mac.init(secretKey); byte[] byteSrc = stringBuilder.toString().getBytes("UTF-8"); // 完成 Mac 操作 byte[] dst = mac.doFinal(byteSrc); // Base64 api.sig = Base64.encodeToString(dst, Base64.NO_WRAP); api.sigType = "HMAC-SHA1";}
注意:appkey作为密钥加密,一定要在末尾加上&,否则签名失败,所有的编码都是UTF8,pubAcc为空,但也必须要加入签名,客户端这个字段直接空字符串就ok。
签名参数:
appId=100202178&bargainorId=1450091201&nonce=AG0ITTDFUQ7UQL9E&pubAcc=&tokenId=5V260ac571ecddafa9e0736b0a5edae6
服务端的哥们儿,一定要注意签名啊,算法,编码,参数,appkey作为密钥加密,都是要注意的点,否则客户端哥们儿会郁闷(因为我就是客户端的哥们儿,看完了服务端demo的各种代码,查找了各种文档(几乎没有相关文档),结果发现后台使用的是支付签名,坑得体无完肤)。
Android客户端:
1.导入jar包(去下载SDK https://qpay.qq.com/qpaywiki/showdocument.php?pid=38&docid=165)
2.回调Activity:
注册:
<activity android:name="cn.zymk.comic.ui.QQPayCallbackActivity" android:launchMode="singleTop" android:exported="true" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="qwallet100802178"/> </intent-filter> </activity>
scheme格式:qwallet+appid,授权QQ的时候需要上传的参数
然后就是回调方法,直接拷贝demo中的即可。
授权上传参数:
PayApi api = new PayApi();
api.serialNumber = mQQPayBean.orderId; // 支付序号,用于标识此次支付
api.callbackScheme = “qwallet” + mQQPayBean.param.appId; // QQ钱包支付结果回调给urlscheme为callbackScheme的activity.,参看后续的“支付回调结果处理”
api.tokenId = mQQPayBean.param.tokenId; // QQ钱包支付生成的token_id
api.pubAcc = “”; // 手Q公众帐号id.参与支付签名,签名关键字key为pubAcc
api.pubAccHint = “”; // 支付完成页面,展示给用户的提示语:提醒关注公众帐号
api.nonce = mQQPayBean.param.nonce; // 随机字段串,每次支付时都要不一样.参与支付签名,签名关键字key为nonce
api.timeStamp = Long.valueOf(mQQPayBean.param.timeStamp); // 时间戳,为1970年1月1日00:00到请求发起时间的秒数
api.bargainorId = mQQPayBean.param.bargainorId; // 商户号.参与支付签名,签名关键字key为bargainorId
api.sig = mQQPayBean.param.sign; // 商户Server下发的数字签名,生成的签名串,参看“数字签名”
api.sigType = “HMAC-SHA1”; // 签名时,使用的加密方式,默认为”HMAC-SHA1”
if (api.checkParams()) {
mIOpenApi.execApi(api);
}
所有的参数最好是后台签名完成后一起返回给客户端。
其实中间还有一些服务端语言,编码相关的问题,描述不太清楚,后面踩到坑的人继续传播一下,因为关于集成QQ钱包的文章少之又少
- 集成QQ钱包---踩坑
- Android-qq钱包支付集成
- 关于QQ钱包支付
- Android集成百度钱包
- 手Q支付(QQ钱包)
- 钱包
- 钱包
- 钱包可以扔一边了 实用iPhone保护壳直接集成钱包功能
- qq钱包里可以充公交卡了
- Android使用微信、支付宝、qq钱包H5支付
- QQ集成登陆
- 【Android】集成QQ登录
- QQ、微信三方登录集成
- 快速集成QQ分享
- 集成腾讯QQ分享
- Android集成QQ登录
- Android集成QQ登录
- Android 集成QQ登录
- 关于实习经历
- SharedPreferences保存各种类型的数据
- 树莓派安装与远程桌面控制
- 图的存储结构——邻接矩阵
- 一张图看懂volume backup流程
- 集成QQ钱包---踩坑
- 给深度学习入门者的Python快速教程
- matlab实现RCNN(一)
- vuejs 组件的认识
- java poi导入导出word文档
- A water problem--------大数取模
- 1.3云存储与传统存储的联系
- ZCMU 1053: Master-Mind Hints
- POJ 3164 Command Network(最小树形图 朱刘算法)