集成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钱包的文章少之又少

原创粉丝点击