腾讯米大师支付服务器端接入流程
腾讯开放平台的接入是非常麻烦的,文档各种不清不楚的,有些东西文档根本没有写,如果不跟腾讯的技术人员对接的话,你都可能做不出来。虽然他们也没有帮到什么
申请过程就不赘述(申请过程很蛋疼),直接开始接入。根据项目需求,我采用的是【米大师道具直购模式】,官方文档,这了提一点,在后面腾讯客服发了个新的米大师文档,这个文档才比较详细。
一、下单
- 下单有两种,一种服务器下单,一种APP下单,我采用的服务器下单
- 建议使用官方的SDK来进行签名,自己来签名可能会失败(我水平太菜)SDK下载
<?php //获取订单信息 ... //必填 APP传递 $data['openid'] = $_POST['openid']; //必填 APP传递 $data['openkey'] = $_POST['openkey']; //应用在米大师注册的应用ID(对应客户端接口中的offerid),String类型 $data['appid'] = '123456789'; $data['ts'] = time(); //平台标识信息:平台-注册渠道-版本-安装渠道-业务自定义(自定义),最大150字节。(自定义部分不能包含单引号 ' < > ( ) + | & = * ^-等特殊字符,支持下划线_) $data['pf'] = 'qq_m_qq-2001-android-2011-xxxx'; $data['pfkey'] = 'ASDFGHJ123456'; //游戏服务器大区id,游戏不分大区则默认zoneId ="1",String类型。如过应用选择支持角色,则角色ID接在分区ID号后用"_"连接。 $data['zoneid'] = '1'; //使用x*p*num的格式,x表示物品ID,p表示单价(以Q点为单位,1Q币=10Q点,单价的制定需遵循腾讯定价规范),num表示默认的购买数量。 $data['payitem'] = '1*10*1'; //商品描述 $data['goodsmeta'] = '充值*金币充值'; //商品图片 $data['goodsurl'] = 'http://www.xxx.com/img.jpg'; //(可选)道具总价格。(amt必须等于所有物品:单价*建议数量的总和 单位为1Q点) $data['amt'] = '10'; //可选 用户可购买的道具数量的最大值 //$data['max_num'] = ''; //(可选)1表示用户不可以修改物品数量,2 表示用户可以选择购买物品的数量。默 认2(注:批量购买的时候,必须等于1) $data['appmode'] = '1'; //如果你不传的话回调里面也会没有,传了回调会加上此参数,并改名为【appmeta】,且格式为【商户自己定义的参数*支付方式*平台渠道】 $data['app_metadata'] = '订单类型*订单编号'; $data['userip'] = '127.0.0.1'; $data['format'] = 'json'; //签名,这里直接调用SDK的方法,不要自己去写,会有很多坑,我之前就是不想用SDK想自己写结果按照文档流程签名死活不对,这里注意 秘钥后面跟了一个【&】 $data['sig'] = SnsSigCheck::makeSig('GET','/v3/r/mpay/buy_goods_m',$data,"你的秘钥&"); //设置cookie,微信与QQ的不一样,我也不知道为什么要设置cookie if ($login_type == 'qq') { $cookie_data = [ 'session_id' => 'openid', 'session_type' => 'kp_actoken', 'org_loc' => rawurlencode('/v3/r/mpay/buy_goods_m'), ]; } elseif ($login_type == 'wx') { $cookie_data = [ 'session_id' => 'hy_gameid', 'session_type' => 'wc_actoken', 'org_loc' => rawurlencode('/v3/r/mpay/buy_goods_m'), ]; } //下单 $result = SnsNetwork::makeRequest('https://ysdktest.qq.com/mpay/buy_goods_m', $data, $cookie_data, 'get');
$result 格式为(我转成了JSON,原本是数组)
{ "result": true, "msg": "{\"ret\":0,\"token\":\"842C2C19D11B7780D0E9B4D8E73ED80531721\",\"url_params\":\"\/v1\/sx8\/1106694898\/mobile_goods_info?token_id=842C2C19D11B7780D0E9B4D8E73ED80531721\",\"attach\":\"\"}" }
返回参数说明
ret
返回码 0 :成功,
>=1000:失败
msg ret不为 0 的时候,错误信息(utf-8编码)
token ret为0的时候,开发者需要保留。后续扣费成功后调用第三方发货时,会再传给开发者,作为本次交易的标识,有效期5分钟
url_params
ret为0的时候,返回真正购买物品的url的参数,开发者需要把该参数
传给sdk跳转到相关页面使用户完成真正的购买动作。
将msg里面的url_params与token返回给APP即可调用支付
二、应用发货回调
1.首先去后台配置回调地址,我这里是https,默认是http,可以用ip,如果用域名的话需要用https,但是你填写的时候他只会提示你要切换https,但是又不告诉你在哪里切。问了客服才知道,要他们来切换。我也是醉了
2.配置好了之后下载证书
hosting应用on CVM(即应用部署在腾讯CVM服务器上):
-发货URL只需HTTP协议即可,不需要使用SSL安全协议。
-必须使用9001端口(内网端口,需开发者主动启用,用apache iis或nginx做一个web监听,端口改成9001)。
hosting应用on CEE_V2(即应用部署在腾讯CEE_V2服务器上):
-发货URL只需HTTP协议即可,不需要使用SSL安全协议。
-必须使用9001端口(内网端口,需开发者主动启用,用apache iis或nginx做一个web监听,端口改成9001)。
-路径必须以ceecloudpay开头,即支付相关代码必须都放到应用根目录下的“ceecloudpay”目录下。
-对于CEE其发货URL的IP只能填写为10.142.11.27或者10.142.52.17(详见:CEE_V2访问云支付)。
non-hosting应用(即应用部署在开发者自己的服务器上)
-发货URL必须使用HTTPS协议。
-必须使用443端口(外网端口)。
注:我用的不是腾讯的服务器所以证书采用的是non-hosting应用
linux服务器证书配置
将下载的证书里面的
ca.crt , xxxxxxxx.crt xxxxx.key 3个文件上传到linux服务器,一般放在项目的私有目录
nginx你项目的配置里面加上
server{ listen 443; server_name 你的网站; index index.php; root 网站目录; ssl on; ssl_certificate 服务器存放的地址/xxxxxxxx.crt; ssl_certificate_key 服务器存放的地址/xxxxxxxx.key; ssl_verify_client off; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; ssl_client_certificate 服务器存放的地址/ca.crt; ssl_verify_depth 1; #其他配置 ... }
重启服务器
手动访问一下看下是否能够访问,能够访问则配置成功
3.回调逻辑,你用get提交的请求,腾讯也用的get回调
回调参数 json_encode($_GET):
{ "amt": "1", "appid": "123456789", "appmeta": "(参考上面下单)订单类型*订单编号*qqwallet*qq", "billno": "流水号", "cftid": "财付通订单号", "channel_id": "00000000-android-00000000-869782022252681-ysdkwater-qq", "clientver": "android", "ebazinga": "1", "openid": "123123123123123", "payamt_coins": "0", "paychannelsubid": "1", "payitem": "3*0.1*1", "providetype": "5", "pubacct_payamt_coins": "", "token": "123123123123123", "ts": "1518081937", "version": "v3", "zoneid": "1", "sig": "H0jsNEOnf1mKIXgZ4mM0pnuk7BQ=" }
这里说是要验证签名,但是我用他的SDK没有验证出来 就放弃了o(╥﹏╥)o
<?php $checkSign = SnsSigCheck::verifySig('get','/v3/r/mpay/buy_goods_m',$_GET,'秘钥&',$_GET['sig']); if($checkSign){ //订单处理逻辑 ... } /* ret: 返回码。 msg: 道具发放操作的结果,成功为“OK”,失败则表明错误原因(必须使用utf8编码)。 腾讯设置的调用开发者发货超时是2秒钟,请开发者注意超时时间设置不要超过2秒, 否则腾讯后台将返回“系统繁忙”的错误消息。 返回建议: 1.在发货接口中记录被调用的log,用于查看是否发货回调接口能够被腾讯支付服务器回调,发起一笔 支付请求,查看发货回调接口是否有被调用。 2.联调回调发货接口时先在接口上固定返回发货成功的标准json字符串{"ret":0,"msg":"OK"},测试一 次支付,查看支付服务器是否能正常接收到回调发货接口返回的标准json内容。 注意:返回的内容中不能有空格、tab等字符、不能有其它多余的内容。 3.以上两步都能顺利通过,说明回调接口能正常被支付服务器调用,然后再在回调接口中加入游戏发货 的业务逻辑。 4. 协议错误码 0: 成功 1: 系统繁忙 2: token已过期 3: token不存在 4: 请求参数错误:(这里填写错误的具体参数) */ echo json_encode([ 'ret' => 0, 'msg' => 'ok', ]); exit;
腾讯的文档太坑爹了