APP调起(IOS)
开发前准备:
商户需要具备以下条件才接入QQ钱包支付:
1、申请QQ钱包商户号:商户可以在QQ钱包商户平台自助申请:https://qpay.qq.com/;
2、提交APP信息审核:商户需登录QQ钱包商户平台,在“账户管理--开发配置--APP支付”一栏,提交APP支付信息审核。审核通过后,才能正常调用SDK拉起支付。
1、安装
QQWalletSDK下的文件为SDK的源代码,可以直接复制到您的工程当中使用:
“QQWalletSDKDemo”为一个调用QQ钱包支付的示例工程。
注意:示例工程为了演示方便,在终端进行数据签名的相关操作。为了保证数据据传输过程中的真实性和完整性,商户App不应在终端代码进行数据签名。建议在商户服务器下发tokenid时,同时按QQ钱包支付的要求下发数字签名相关数据。
2、使用说明
(1) 在您的工程中的info.plist文件中创建用于回调的URLScheme。此URL Scheme用于手机QQ完成功能后,传递结果信息用。请尽量保证此URL Scheme不会与其他冲突。另外,为了判断当前手机是否支持QQ钱包支付,还需要在LSApplicationQueriesSchemes字段里增加值mqqwallet,如下图所示:
(2)在**appDelegate.m中注册回调监听:
- (BOOL) application:(UIApplication *)applicationopenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplicationannotation:(id)annotation
{
// 在此函数中注册回调监听
if([[QQWalletSDK sharedInstance] hanldeOpenURL:url]) {
return YES;
}
return YES;
}
支付接口调起QQ钱包进行支付:
- (void)startPayWithAppId:(NSString *)appId
bargainorId:(NSString *)bargainorId
tokenId:(NSString *)tokenId
signature:(NSString *)sig
nonce:(NSString *)nonce
scheme:(NSString *)scheme
completion:(void (^)(QQWalletErrCode errCode, NSString*errStr))completion;
所有参数都为必传参数:
参数 | 类型 | 含义 |
appId | NSString | 第三方APP在腾讯开放平台申请的appID |
bargainorId | NSString | 第三方APP在财付通后台的商户号(值为后台接口传入的mch_id) |
tokenId | NSString | 在财付通后台下单的订单号(值为后台接口返回的prepay_id) |
sig | NSString | 参数按照规则签名后的字符串 |
nonce | NSString | 签名过程中使用的随机串 |
scheme | NSString | 在工程中的info.plist文件中创建用于回调的URL Scheme。 见:2.1 |
completion | block | 回调的Block |
您需要实现Block的内容来处理回调:
void (^)(QQWalletErrCode errCode, NSString *errStr)
其中QQWalletErrCode的定义为:
QQWalletErrCodeSuccess:支付成功
QQWalletErrCodeCommon:支付失败
QQWalletErrCodeUserCancel:用户点击取消并返回
4、数字签名
为了保障商户利益与安全,商户App调用QQ钱包支付时启用另一套签名机制。该签名机制与“商户后台与QQ钱包支付后台的签名机制”是不同的。
4.1源串构造方法
(1) 将需要参与签名的所有参数按key进行字典升序排列。
(2) 将第1步中排序后的参数(key=value)用&拼接起来;
(3) key中存在大小写字母,保持大小写字母的存在。不要将key进行统一转换为大写或小写操作;
(4) 如果value为空, 生成格式为“key=”,这点与后台之间签名方法是不一样的;
(5) 签名原始串中,字段名和字段值都采用原始值,不进行URL Encode。
举例:
调用某个接口,接口有如下字段:
appId、nonce、tokenId、pubAcc、bargainorId
实际调用接口时,各字段的值:
appId=100619284、nonce=ksjfwierwfjk、tokenId=1000000002、pubAcc=、bargainorId=1900000109
正确的签名原始串是:
appId=100619284&bargainorId=1900000109&nonce=ksjfwierwfjk&pubAcc=&tokenId=1000000002
常见的错误有:
appId=100619284&bargainorId=1900000109&nonce=ksjfwierwfjk&tokenId=1000000002
appid=100619284&bargainorid=1900000109&nonce=ksjfwierwfjk&pubacc=&tokenid=1000000002
appId=100619284&nonce=ksjfwierwfjk&tokenId=1000000002&pubAcc=&bargainorId=1900000109
4.2密钥构造方法
(1)在http://open.qq.com申请appId,并获得appKey;
(2)构造到密钥的方式:在应用的appkey末尾加上一个字符的“&”,即appkey&。
示例:
appkey 值为 d139ae6fb0175e5659dce2a7c1fe84d5
正确的密钥为:d139ae6fb0175e5659dce2a7c1fe84d5&
4.3生成签名值方法
(1) 使用HMAC-SHA1加密算法,使用“密钥构造方法”中得到的密钥对“原串构造方法”中得到的源串进行加密(注:一般程序语言中会内置HMAC-SHA1加密算法的函数,例如PHP5.1.2之后的版本可直接调用hash_hmac函数);
(2) 然后将加密后的字符串进行Base64编码(注:一般程序语言中会内置Base64编码函数,例如PHP中可直接调用 base64_encode() 函数);
(3) 最后得到的签名值sig结果如下:
c6xXw0tNABhOMc869h1bfxTp9Mk=
FAQ
Q:接入QQ钱包支付,对手机QQ Android版本有什么要求?
A:手机QQ Android 5.3.0版本以上对第三方商户应用提供了支付接入的功能。因此,商户应用在调用QQ钱包支付前需要作一下判断。
Q: 商户生成订单token_id是否可以在前端访问财付通下单接口生成?
A: 技术上是可以的,但为避免商户的签名Key泄露,建议商户通过后台服务器访问此接口,得到订单token_id后再传回商户的前台应用。
Q:用户在手机QQ侧支付完成后,商户应用怎样知道支付是否成功?
A:手机QQ侧支付成功后,其会发出特定协议格式的Intent,回调商户应用,返回支付成功信息;商户应用可依赖手机QQ前端回调进行支付结果的展示,可依赖财付通后台回调notify_url进行发货等逻辑处理。