米大师介绍——道具直购模式介绍

目录

1. 模式概述

这部分内容主要介绍道具直购模式的业务流程,具体包括服务器下订单和客户端下订单两种方式。目前道具直购模式仅提供单机游戏使用

2. 服务器端下单

2.1 服务器端下单后台接口

道具直购模式,需要应用调用该接口执行下订单操作,获取到支付服务器返回的订单url。

•URL地址:

【现网】https://ysdk.qq.com/mpay/buy_goods_m

【沙箱】https://ysdktest.qq.com/mpay/buy_goods_m


•参数说明:

1. Cookie里面需要包含的参数

Cookie 参数:

游客登陆为

       session_id="hy_gameid"
       session_type="st_dummy"
session_id      用户账户类型,(手Q)session_id ="openid";(微信)session_id = "hy_gameid"
session_type    session类型,(手Q)session_type = "kp_actoken";(微信)session_type = "wc_actoken"
org_loc         需要填写: /v3/r/mpay/buy_goods_m 
注意:cookie里面org_loc的值,需要进行urlencode
2. 请求参数:
openid: 从手Q登录态中获取的openid的值
openkey:手Q登陆时传手Q登陆回调里获取的paytoken值,微信登陆时传微信登陆回调里获取的传access_token值。
         游客登陆传openkey
   
appid:  应用的唯一ID。可以通过appid查找APP基本信息。
ts:   UNIX时间戳(从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数)。
payitem: 请使用x*p*num的格式,x表示物品ID,p表示单价(以Q点为单位,1Q币=10Q点,单价
               的制定需遵循腾讯定价规范),num表示默认的购买数量。(格式:物品ID1*单价1*
               建议数量1,批量购买物品时使用;分隔,如:id1*price1*num1;id2*price2*num2)长
               度必须<=512
goodsmeta:  物品信息,格式必须是“name*des”,批量购买套餐时也只能有1个道具名称和1个
               描述,即给出该套餐的名称和描述。name表示物品的名称,des表示物品的描述信
               息。用户购买物品的确认支付页面,将显示该物品信息。长度必须<=256字符,必须
               使用utf8编码。目前goodsmeta超过76个字符后不能添加回车字符。
goodsurl:   物品的图片url(长度<512字符)
sig:        请求串的签名,参考Sig签名计算。
pf:     平台来源,参考公共参数说明。
pfkey:        跟平台来源和openkey根据规则生成的一个密钥串。如果是腾讯自研应用固
               定传递pfkey=”pfkey”
zoneid:       账户分区ID。应用如果没有分区:传zoneid=1
amt:        (可选)道具总价格。(amt必须等于所有物品:单价*建议数量的总和 单位为1Q点)
max_num:    (可选) 用户可购买的道具数量的最大值。仅当appmode的值为2时,可以输入该参
               数。输入的值需大于参数“payitem”中的num,如果小于num,则自动调整为num的值。
appmode:    (可选)1表示用户不可以修改物品数量,2 表示用户可以选择购买物品的数量。默
               认2(批量购买的时候,必须等于1)
app_metadata: (可选)发货时透传给应用。长度必须<=128字符
userip:       (可选)用户的外网IP
format: 可选)json、jsonp_$func。默认json。如果jsonp,前缀为:$func 
例如:format=jsonp_sample_pay,返回格式前缀为:sample_pay()
3.注意事项:

&nbsp&nbsp1、批量购买道具的时候,appmode必须为1。

4.返回参数说明

ret:           返回码0:成功, >=1000:失败
msg:           ret不为0的时候,错误信息(utf-8编码)。
token:     ret为0的时候,开发者需要保留。后续扣费成功后调用第三方发货时,会再传给开发
              者,作为本次交易的标识。
url_params:  ret为0的时候,返回真正购买物品的url的参数,开发者需要把该参数传给sdk跳转到相
            关页面使用户完成真正的购买动作。
5.返回示例
{"ret" : 0,"url_params" : "/v1/m01/11157/mobile_goods_info?  token_id=706E0C25FD24B948DD129CBC202129B922463 ","token_id" :  "706E0C25FD24B948DD129CBC202129B922463"}
 

2.2 道具直购客户端接口 (服务器下单,仅单机游戏可用)

该接口用于通过后台服务器下单的道具直购场景,游戏调用接口以后唤起腾讯支付页面引导用户完成付费,用户付费结束以后,结果会通过参数中的YSDKPayListener回调给游戏,同时米大师会调用游戏在米大师配置的回调地址发货。

•接口声明:
/**
 * 道具直购 — 服务器下单
 * @param zoneId 大区id
 * @param goodsTokenUrl 后台下订单返回的urlPara
 * @param resData 代币图标的二进制数据
 * @param ysdkExtInfo YSDK透传参数,会在listener中回调给游戏
 * @param listener 充值回调
 */
void buyGoods(String zoneId, String goodsTokenUrl, byte[] resData, String ysdkExtInfo, PayListener listener);
 
•接口调用:
String zoneId = "1";
String goodsTokenUrl ="/v1/xs1/110***6059/mobile_goods_info?token_id=211FB8F9199683F*****E6B355A3422123";
Bitmap bmp = BitmapFactory.decodeResource(mMainActivity.getResources(), R.drawable.sample_yuanbao);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] appResData = baos.toByteArray();
String ysdkExt = "ysdkExt";
void buyGoods(zoneId, goodsTokenUrl,appResData,ysdkExt,new PayListener() {
    @Override
    public void OnPayNotify(PayRet ret) {
        if(PayRet.RET_SUCC == ret.ret){
            //支付流程成功
            switch (ret.payState){
                //支付成功
                case PayRet.PAYSTATE_PAYSUCC:
                    mMainActivity.sendResult(
                            "用户支付成功,支付金额"+ret.realSaveNum+";" +
                            "使用渠道:"+ret.payChannel+";" +
                            "发货状态:"+ret.provideState+";" +
                            "业务类型:"+ret.extendInfo+";建议查询余额:"+ret.toString());
                    break;
                //取消支付
                case PayRet.PAYSTATE_PAYCANCEL:
                    mMainActivity.sendResult("用户取消支付:"+ret.toString());
                    break;
                //支付结果未知
                case PayRet.PAYSTATE_PAYUNKOWN:
                    mMainActivity.sendResult("用户支付结果未知,建议查询余额:"+ret.toString());
                    break;
                //支付失败
                case PayRet.PAYSTATE_PAYERROR:
                    mMainActivity.sendResult("支付异常"+ret.toString());
                    break;
            }
        }else{
            switch (ret.flag){
                case eFlag.User_LocalTokenInvalid:
                    //用户取消支付
                    mMainActivity.sendResult("登陆态过期,请重新登陆:"+ret.toString());
                    mMainActivity.letUserLogout();
                    break;
                case eFlag.Pay_User_Cancle:
                    //用户取消支付
                    mMainActivity.sendResult("用户取消支付:"+ret.toString());
                    break;
                case eFlag.Pay_Param_Error:
                    mMainActivity.sendResult("支付失败,参数错误"+ret.toString());
                    break;
                case eFlag.Error:
                default:
                    mMainActivity.sendResult("支付异常"+ret.toString());
                    break;
            }
        }
    }
});

3. 客户端下单模式

3.1. 道具直购客户端接口 (客户端下单,仅单机游戏可用)

该接口用于通过客户端下单的道具直购场景,游戏调用接口以后唤起腾讯支付页面引导用户完成付费,用户付费结束以后,结果会通过参数中的YSDKPayListener回调给游戏,同时米大师会调用游戏在米大师配置的回调地址发货。

•接口声明:
/**
 * 道具直购 — 服务器下单
 * @param zoneId 大区id
 * @param item 购买道具的信息
 * @param midasAppkey 游戏midas的appkey
 * @param resData 代币图标的二进制数据
 * @param midasExt midas透传参数,会在调用发货接口时透传给游戏
 * @param ysdkExtInfo YSDK透传参数,会在listener中回调给游戏
 * @param listener 充值回调
 */
void buyGoods(String zoneId, PayItem item, 
        String midasAppkey, byte[] resData, String midasExt, String ysdkExtInfo, PayListener listener);
 
•PayItem介绍:

PayItem包含购买道具的相关信息,在调用客户端下单接口时必须同步传入对应信息

字段说明 字段名称 备注
道具ID id 游戏内自定义的道具id
道具名称 name 道具名称,支付是会显示在界面
道具描述 desc 道具描述
道具单价 price 道具单价,单价以Q点(角)为单位
购买数量 num 购买该道具的数量,在支付页面不可修改

•接口调用:

String zoneId = "1";
PayItem item = new PayItem();
item.id = "ID1";
item.name = "道具名称";
item.desc = "道具描述";
item.price = 1;
item.num = 5;
Bitmap bmp = BitmapFactory.decodeResource(mMainActivity.getResources(), R.drawable.sample_yuanbao);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] appResData = baos.toByteArray();
String ysdkExt = "ysdkExt";
String midasExt = "midasExt";
YSDKApi.buyGoods(zoneId,item,"sdsfdsfdf",appResData,midasExt,ysdkExt,new PayListener() {
    @Override
    public void OnPayNotify(PayRet ret) {
        if(PayRet.RET_SUCC == ret.ret){
            //支付流程成功
            switch (ret.payState){
                //支付成功
                case PayRet.PAYSTATE_PAYSUCC:
                    mMainActivity.sendResult(
                            "用户支付成功,支付金额"+ret.realSaveNum+";" +
                            "使用渠道:"+ret.payChannel+";" +
                            "发货状态:"+ret.provideState+";" +
                            "业务类型:"+ret.extendInfo+";建议查询余额:"+ret.toString());
                    break;
                //取消支付
                case PayRet.PAYSTATE_PAYCANCEL:
                    mMainActivity.sendResult("用户取消支付:"+ret.toString());
                    break;
                //支付结果未知
                case PayRet.PAYSTATE_PAYUNKOWN:
                    mMainActivity.sendResult("用户支付结果未知,建议查询余额:"+ret.toString());
                    break;
                //支付失败
                case PayRet.PAYSTATE_PAYERROR:
                    mMainActivity.sendResult("支付异常"+ret.toString());
                    break;
            }
        }else{
            switch (ret.flag){
                case eFlag.User_LocalTokenInvalid:
                    //用户取消支付
                    mMainActivity.sendResult("登陆态过期,请重新登陆:"+ret.toString());
                    mMainActivity.letUserLogout();
                    break;
                case eFlag.Pay_User_Cancle:
                    //用户取消支付
                    mMainActivity.sendResult("用户取消支付:"+ret.toString());
                    break;
                case eFlag.Pay_Param_Error:
                    mMainActivity.sendResult("支付失败,参数错误"+ret.toString());
                    break;
                case eFlag.Error:
                default:
                    mMainActivity.sendResult("支付异常"+ret.toString());
                    break;
            }
        }
    }
});

以上信息是否解决您的问题?

Copyright © 1998 - 2017 Tencent. All Rights Reserved.

腾讯公司 版权所有

有问必答 返回顶部