开发文档

SDK(IOS)

开发前准备:

商户需要具备以下条件才接入QQ钱包支付:

1、申请QQ钱包商户号:商户可以在QQ钱包商户平台自助申请:https://qpay.qq.com/

2、提交APP信息审核:商户需登录QQ钱包商户平台,在“账户管理--开发配置--APP支付”一栏,提交APP支付信息审核。审核通过后,才能正常调用SDK拉起支付。


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;

}

3、功能调用

支付接口调起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进行发货等逻辑处理。