腾讯应用宝米大师直购模式支付流程以及服务端php回调校验

一. 米大师简介

1.米大师(Midas)为腾讯官方唯一虚拟支付平台。

2.YSDK已经内置了米大师(Midas)支付模块,游戏开发者接入YSDK后,可以通过相应的配置开启米大师的支付功能,并调用YSDK已经封装好的接口,即可快速实现支付能力。目前已支持微信支付(wechat)、QQ钱包(qqwallet)两种支付渠道。

3.米大师(Midas)目前支持直接购买道具(直购模式)、游戏币、游戏币+直接购买道具三种模式,本文重点介绍直购模式,其他支付模式请参考该文档。

二. 直购模式介绍

2.1 计费信息介绍及填写

计费信息名称

介绍/填写说明

模式含义

直接购买道具或服务(直接购买道具礼包,通过回调接口游戏方自己发货)。

支持游戏类型

联运网游/单机类型均可支持。

配置路径

(1)通过“腾讯应用开放平台-基础服务-支付管理-计费接入”该路径。

(2)通过“腾讯应用开放平台-基础服务-SDK接入-YSDK支付信息配置”该路径。

支付权限获取

沙箱环境:需在”腾讯开放平台-支付结算-计费接入“发布沙箱成功后,即可获得沙箱环境支付权限。

现网环境:需在”腾讯开放平台-支付结算-计费接入“发布现网成功后,即可获得现网环境支付权限。

注意事项:

1)游戏配置计费信息时,需先配置并调试沙箱环境成功,再配置并调试现网环境,具体参考配置米大师计费信息配置步骤指引。

2)请勿在沙箱环境调试现网环境支付信息,同时也请勿在现网环境调试沙箱环境支付信息,否则会提示无支付权限(报错码为1016-1016-0)。

应用计费ID

游戏创建时会自动分配,接入计费时平台自动拉取,无需填写。

应用名称

该应用名称米大师用来标识业务,需和创建时名称一致。

支付展示应用名称

该应用名称为游戏内支付时显示的游戏名称、及玩家充值成功后交易记录中所显示游戏名称。

支付模式

选择“直接购买道具”。

托管类型

(1)需先选择支付模式为“直接购买道具”,才会展示发货托管类型选择项。

(2)外部服务器:

腾讯云服务器:若游戏使用腾讯云服务器,IP地址非基础网络,需选择外部服务器,并下载安装米大师证书。

非腾讯云服务器:比如阿里云、华为云服务器等,需选择外部服务器,并下载安装米大师证书。

注意事项:

以上两种服务器,回调地址配置时,均需使用“https”协议和“443”接口。

回调接口

(1)多款游戏不支持回调接口共用。

(2)沙箱和现网回调接口不支持共用。

(3)回调接口配置详细步骤需参考米大师计费信息配置文档。

米大师证书

(1)下载路径:回调接口管理-接口证书-下载。

(2)沙箱和现网米大师CA证书不支持共用。

(3)米大师证书安装需参考米大师CA证书配置说明文档。

(4)证书有效期:现网证书10年,沙箱证书1年,建议到期前及时更换,更换时需重新下载证书进行配置。

2.2 计费信息变更

计费信息名称

变更说明

应用计费ID(offerid)

游戏创建时自动分配,接入计费时平台自动拉取,无需变更。

应用名称

建议游戏在沙箱环境确认好应用名称,在应用宝平台首发后不支持变更。

支付展示应用名称

建议游戏在沙箱环境确认好支付展示应用名称,在应用宝平台首发后不支持变更。

支付模式

(1)修改为游戏币模式,仅支持在应用宝平台首发前变更。

(2)修改为游戏币+直购模式,仅支持在应用宝平台首发前变更,且一旦变更为游戏币+直购模式,发布现网后不可回退为直购模式。

回调地址

仅支持游戏首发应用宝平台前变更,若特殊原因需更换线上游戏回调发货地址,需联系应用宝客服或商务报备申请。

线上游戏新增计费点

直购物品id价格是业务侧自定义的,线上游戏新增计费点配置后,需发布现网调试成功即可。

2.3 支付流程示意图

服务器端下单流程:

客户端下单流程:

(1) 成功发货

条件一:在游戏接入平台创建新应用时,在分区配置中配置了回调接口URL,URL用于提供给腾讯后台回调。用户付费成功后,腾讯后台将回调该URL通知业务发货。

条件二:开发者需按照《回调发货URL的协议说明》进行发货URL的开发,收到米大师的回调后必须2s内返回{“ret":0,"msg":"OK"}才认为时发货成功。

(2) 发货失败

由于网络等原因可能回调业务失败,米大师有以下三种重试机制:

微信支付渠道:不退款,24小时内总共会发起15次通知,通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h

QQ钱包:不退款,2小时内重试9次(15s/15s/30s/180s/1800s/1800s/1800s/1800s/3600s)

Q币、Q卡:回调发货失败5分钟后会退款。

三. 直购模式准备工作

1. 填写基本资料

直购模式不需要配置兑换比例,但必须配置回调接口,本环节重点介绍托管类型选择、回调接口配置、米大师证书安装说明;基本信息、分区介绍可参考游戏币模式填写说明。

1.1 托管类型

外部服务器

注:外部服务器,指非腾讯云和腾讯自研的其他服务器,比如阿里云、华为云服务器等。

2. 回调接口

注:沙箱和现网回调接口不可以使用同一个,且多个游戏也不可以使用同一个发货地址。

3.米大师证书下载安装

米大师证书必须先新增沙箱或现网接口后才会显示下载入口,沙箱和现网配置步骤相同,以沙箱环境为例,如下图:

注意:

(1)使用外部托管类型的游戏必须安装米大师证书。

(2)目前腾讯云(DEV)服务器已不支持基础网络,所以使用腾讯云(DEV)服务器的,均需要选择https协议,同时也需要安装下载米大师证书。

(3)直购模式下,腾讯云服务器回调接口和米大师证书下载安装步骤请参考上述步骤。

(4)沙箱和现网的证书不可共用,需各自使用对应环境下载的证书。

(5)多个游戏不可使用同一个米大师证书。

(6)回调发货协议说明请参考米大师文档。

三. 直购模式客户端接入

1. 直购支付流程图

服务器下单流程:

客户端下单流程:

2. 概述

直购模式支持单机和网游游戏。

客户端下单模式是指用户直接通过下述api调用唤起腾讯支付页面引导用户完成付费,用户付费结束后,结果会通过参数重的YSDKPayListener回调给游戏,同时米大师会调用游戏在米大师配置的回调地址发货。

3. 请求参数

参数名称

描述

iscanchange

是否可以在拉起的支付页面进行变更

zoneid

分区id

item

支付项

item.id

游戏内自定义的道具id

Item.name

道具的名称,支付时会显示在支付页面上

Item.desc

道具描述

Item.price

道具单价,单价以Q点(角)为单位

Item.num

购买数量,在支付页面上不可修改

item.unit

物品单位

midasAppkey

游戏中米大师的appkey。

注:沙箱用沙箱的appkey,现网用现网的appkey.

resData

游戏代币图标的二进制数据

midasExt

米大师透传参数,会调用发货接口时透传给游戏

ysdkExtInfo

YSDK透传参数,会在listener中回调给游戏

listener

充值回调

4. 请求示例

String zoneId = "1";

PayItem item = newPayItem();

item.id = "ID1";

item.name = "道具名称";

item.desc = "道具描述";

item.price = 1;

item.num = 5;

item.unit= "道具单位";

Bitmap bmp = BitmapFactory.decodeResource(mMainActivity.getResources(), R.drawable.sample_yuanbao);

ByteArrayOutputStream baos = newByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] appResData = baos.toByteArray();

String ysdkExt = "ysdkExt"; String midasExt = "midasExt";

YSDKApi.buyGoods(false,zoneId,item,"sdsfdsfdf",appResData,midasExt,ysdk Ext,newPayListener() {

@Override

publicvoidOnPayNotify(PayRet ret) { if(PayRet.RET_SUCC == ret.ret){

//⽀付流程成功

switch(ret.payState){

//⽀付成功

casePayRet.PAYSTATE_PAYSUCC: mMainActivity.sendResult(

"⽤户⽀付成功,⽀付⾦额"+ret.realSaveNum+";"+

"使⽤渠道:"+ret.payChannel+";"+ "发货状态:"+ret.provideState+";"+ "业务类型:"+ret.extendInfo+";建议查询余

额:"+ret.toString());

break;

//取消⽀付

casePayRet.PAYSTATE_PAYCANCEL: mMainActivity.sendResult("⽤户取消⽀

付:"+ret.toString());

break;

//⽀付结果未知

casePayRet.PAYSTATE_PAYUNKOWN: mMainActivity.sendResult("⽤户⽀付结果未知,建议查询余

额:"+ret.toString());

break;

//⽀付失败

casePayRet.PAYSTATE_PAYERROR: mMainActivity.sendResult("⽀付异常"+ret.toString()); break;

}

}else{

switch(ret.flag){

caseeFlag.User_LocalTokenInvalid:

//⽤户取消⽀付 mMainActivity.sendResult("登陆态过期,请重新登

陆:"+ret.toString());

mMainActivity.letUserLogout(); break;

caseeFlag.Pay_User_Cancle:

//⽤户取消⽀付 mMainActivity.sendResult("⽤户取消⽀

付:"+ret.toString());

break;

caseeFlag.Pay_Param_Error: mMainActivity.sendResult("⽀付失败,参数错

误"+ret.toString());

break;

}

5. 返回参数

参数名称

描述

Ret

0成功1失败

flag

0成功非0失败

msg

ret不为0的时候,错误信息(utf-8编码)

注意事项:

支付不以客户端的结果为准。

四.直购模式服务端下单接入

1. 概述

直购模式分为服务器下订单和客户端下订单两种。 客户端下订单请参考客户端接入

2. 服务端下单模式

服务器下单模式是指游戏应⽤开发者在游戏中调⽤如下接⼝执⾏订单操作,获取到⽀付服务器返回的订单url

现⽹:https://ysdk.qq.com/mpay/buy_goods_m

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

3. 请求参数

3.1 Cookie参数

参数名称

描述

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 (注意:如果经过接口机器,需要填写应用签名时使用的URI)

appip

(可选)来源的第三方应用的服务IP

注意事项:

cookie里面org_loc的值,需要进行urlencode,如果使用开平提供的 OpenAPI V3.0 SDK 计算签名,org_loc不需要进行urlencode,因为sdk已经在内部做了编码。

session_id中openid为固定的字符串字段,并非登录成功后获取的openid

游客登陆为

session_id="hy_gameid"

session_type="st_dummy"

3.2 请求参数

参数名称

描述

openid

从手Q登录态中获取的openid的值

openkey

手Q登陆时传手Q登陆回调里获取的paytoken值,微信登陆时传微信登陆回调里获取的传access_token值。游客登陆传openkey

appid

应用的唯一ID。可以通过appid查找APP基本信息。

ts

UNIX时间戳(从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数)。

pf

平台来源,参考公共参数说明。

pfkey

跟平台来源和openkey根据规则生成的一个密钥串。如果是腾讯自研应用固定传递pfkey=”pfkey”

zoneid

账户分区ID。应用如果没有分区:传zoneid=1

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

请求串的签名,参考YSDK支付接口签名说明。

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()

sp_info

(可选)传code_id,batch_id,道具模式下单后台传抵扣券ID

以下参数只有走订单

中心情况下需要传,

其他情况不传

out_trade_no

订单号

goods_tag

新增字段.表示微信订单优惠标记.

透传给微信,格式参考:https://pay.weixin.qq.com/wiki/doc/api/danpin.php?chapter=9_102&index=2 对应的goods_tag字段

wx_goods_detail

新增字段.表示微信商品详情信息.需要对内容urlencode.(最大长度是encode前的长度)

透传给微信,格式参考:https://pay.weixin.qq.com/wiki/doc/api/danpin.php?chapter=9_102&index=2 对应的detail字段

4. 请求示例

curl "http://IP:端口/v3/r/mpay/buy_goods_m?appid=1450001088&openid=odFzSjlSIm09-35bPDeHrwzO1rqU&openkey=

35_c79HmE4aWyrmrIuq6p6lMelVzG4pqMSNobfqDUON9SYixKJyVBO4YwGCMURygpYRFU3_7PPJbkkKVXpIRDDHe323Bp_WPDeG-23XVB_

QGqI&ts=1596180606&pf=desktop_m_qq-1001-android-73213123-qq-1107898689-0AC547EC71BCCED71594AA1A97177675&pfkey

=cd517e6bb043504da99906e5e99a6c87&zoneid=1&payitem=1711*1*1&goodsmeta=test*test&out_trade_no=20200313001&sig=

4+UTHzcgJwn1bzj8nQO3KQY+WSw=" -b "session_id=hy_gameid;session_type=wc_actoken;org_loc=/v3/r/mpay/buy_goods_m"

5. 道具直购客户端接口 (服务器下单)

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

5.1 接口声明

参数名称

描述

zoneId

大区id

goodsTokenUrl

后台下订单返回的urlPara

resData

代币图标的二进制数据

ysdkExtInfo

YSDK透传参数,会在listener中回调给游戏

listener

充值回调

5.2 请求示例

voidbuyGoods(String zoneId, String goodsTokenUrl, byte[] resData, String ysdkExtInfo, PayListener listener);

5.3 接口调用

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 = newByteArrayOutputStream();

bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);

byte[] appResData = baos.toByteArray();

String ysdkExt = "ysdkExt";

voidbuyGoods(zoneId, goodsTokenUrl,appResData,ysdkExt,newPayListener() {

@Override

publicvoidOnPayNotify(PayRet ret) {

if(PayRet.RET_SUCC == ret.ret){

//支付流程成功

switch(ret.payState){

//支付成功

casePayRet.PAYSTATE_PAYSUCC:

mMainActivity.sendResult(

"用户支付成功,支付金额"+ret.realSaveNum+";"+

"使用渠道:"+ret.payChannel+";"+

"发货状态:"+ret.provideState+";"+

"业务类型:"+ret.extendInfo+";建议查询余额:"+ret.toString());

break;

//取消支付

casePayRet.PAYSTATE_PAYCANCEL:

mMainActivity.sendResult("用户取消支付:"+ret.toString());

break;

//支付结果未知

casePayRet.PAYSTATE_PAYUNKOWN:

mMainActivity.sendResult("用户支付结果未知,建议查询余额:"+ret.toString());

break;

//支付失败

casePayRet.PAYSTATE_PAYERROR:

mMainActivity.sendResult("支付异常"+ret.toString());

break;

}

}else{

switch(ret.flag){

caseeFlag.User_LocalTokenInvalid:

//用户取消支付

mMainActivity.sendResult("登陆态过期,请重新登陆:"+ret.toString());

mMainActivity.letUserLogout();

break;

caseeFlag.Pay_User_Cancle:

//用户取消支付

mMainActivity.sendResult("用户取消支付:"+ret.toString());

break;

caseeFlag.Pay_Param_Error:

mMainActivity.sendResult("支付失败,参数错误"+ret.toString());

break;

caseeFlag.Error:

default:

mMainActivity.sendResult("支付异常"+ret.toString());

break;

}

}

}

});

6. 返回参数

参数名称

描述

ret

返回码0:成功, >=1000:失败

msg

ret不为0的时候,错误信息(utf-8编码)。

token

ret为0的时候,开发者需要保留。后续扣费成功后调用第三方发货时,会再传给开发者,作为本次交易的标识。

url_params

ret为0的时候,返回真正购买物品的url的参数,开发者需要把该参数传给sdk跳转到相关页面使用户完成真正的购买动作。

五.直购模式客户端下单案例

1.前端拉起商品列表

用户登录app后,进入商品购买页面,前端请求app商品列表api接口,获取商品列表信息并展示

2.下单

用户点击'购买'操作,发送给服务端一条当前商品信息,服务端保存该商品的相关订单数据,并返回给前端腾讯米大师支付所需要的请求数据,前端调用米大师支付sdk,发起支付请求
    /*** 腾讯应用宝米大师支付下单* @param array $params 订单信息* @return array*/public static function Pay($params){//获取商品内部订单号$innerOno = self::genInnerOno(date("Y-m-d H:i:s"), $params['user_id'], $paymentType);//生成订单$order = new Order();$order->order_id = $innerOno;  // 内部订单号$order->product_name = $params['name'];  // 商品名称$order->number = $params['num'];  // 购买商品个数$order->price = $params['price'];  // 商品单价, 1个商品价格$order->total_price = $params['total_price'];  // 总的价格$order->pay_amount = $params['pay_amount'];  // 应付总额:  实际应该支付的价格= 总金额 - 优惠金额$order->count = $params['count'];  // 购买后得到商品对应的产品数量$order->status = 0;  // 状态:0 待支付     $order->user_id = $params['user_id'];  // 用户游戏ID$order->expired_at = $params['expired_at'];  // 过期时间$order->created_by = $params['created_by'];  // 创建者$order->updated_by = $params['updated_by'];  // 创建者$result = $order->save();if (!$result) {$errors = '';if ($order->hasErrors()) {$tmp = $order->getErrors();foreach ($tmp as $rows) {foreach ($rows as $row) {$errors .= $row . '<br/>';}}}throw new \Exception($errors);}$orderId = $order->id;//构建vivo支付所需要的数据$title = $order->product_name;//过滤掉特殊字符$title = replaceStr($title);$config = Yii::$app->params['tencent.app']; //腾讯应用宝配置$price = intval($model->pay_amount * 10);//游戏中米大师的appkey,沙箱用沙箱的appkey,现网用现网的appkey.$midasAppkey = $config['tx_midas_is_sandbox'] == 1 ? $config['tx_midas_sandbox_app_key'] : $config['tx_midas_now_app_key'];//构建向应用宝发送的参数$data = ['iscanchange' => false, //是否可以在拉起的支付页面进行变更'zoneid' => 1,  //分区id'id' => $model->order_id,  //游戏内自定义的道具id'name' => $title,  //道具的名称,支付时会显示在支付页面上'desc' => $title,  //道具描述'price' => $price,  //道具单价,单价以Q点(角)为单位'num' => 1,  //购买数量,在支付页面上不可修改'unit' => '个',  //物品单位'midasAppkey' => $midasAppkey,  //游戏中米大师的appkey,注:沙箱用沙箱的appkey,现网用现网的appkey.'midasExt' => 'midasExt',  //米大师透传参数,会调用发货接口时透传给游戏'ysdkExtInfo' => 'ysdkExtInfo',  //YSDK透传参数,会在listener中回调给游戏];return jsonFail($data);}/*** 生成本系统内部订单号, 在向第三方服务商发起支付时需要使用.** 下单时的处理流程:*   1. 属性 ono 不要赋值, 成功插入(保存)订单.*   1. 支付前生成本系统内部订单号, 向第三方发起支付请求.*   1. 接收到支付成功回调通知时, 将第三方订单号保存到本次付款的订单的 ono 字段上.** 格式: 下单时间+支付方式+ 4位数字修正值. 如 "20150930140041+1+1234".* 最大长度 32 个字符. 这也是 wx 可接受的订单号最大长度.** @param int $createdAt 订单创建时间戳, 即 下单时间戳.* @param int $createdBy 订单创建人 ID, 即 下单会员 ID.* @return string* @throws \Exception*/public static function genInnerOno($createdAt, $createdBy){$createdAt = strtotime($createdAt);if (1 > $createdAt || 1 > $createdBy) {throw new \Exception('参数错误');}// 生成一个修正值, 一定程度上增加订单号的随机性.$tmp = intval(substr($createdAt, -4)) + intval(substr($createdBy, -2));if (4 < strlen($tmp)) {$tmp = substr($tmp, -4);}$tmp = date('YmdHis', $createdAt) . $tmp . rand(100, 900);return $tmp;}

3. 支付

前端获取服务端返回的支付所需要的请求数据后,拼接支付请求参数,调用米大师支付sdk,发起支付请求

4. 回调操作

前端支付成功后,米大师会请求服务端的回调方法( 三. 直购模式准备工作中的配置步骤),对支付订单进行校验验签操作,根据验签结果,处理订单业务逻辑
php以yii2框架为参考
    /*** 腾讯应用宝支付回调处理: 异步回调操作: 主动请求多次, 用于处理商家订单状态等逻辑操作*/public function actionNotify(){/获取回调通知数据$inBodyArray = $_GET;//判断通知请求$trans = Yii::$app->db->beginTransaction();try {//引入米大师SDK$dir = Yii::getAlias('@common/lib/tenxun/PHP_SDK_V3.0.9');require_once $dir . '/lib/SnsSigCheck.php';//签名校验$config = Yii::$app->params['tencent.app'];//获取AppKey$midasAppkey = $config['tx_midas_is_sandbox'] ? $config['tx_midas_sandbox_app_key'] : $config['tx_midas_now_app_key'];$checkSign = \SnsSigCheck::verifySig('GET', '/notify', $inBodyArray, $midasAppkey . '&', $inBodyArray['sig']);if ($checkSign) { //处理业务逻辑$cftid = $inBodyArray["cftid"]; //财付通订单号$payitem = $inBodyArray['payitem'];//物品信息$payitem = explode("*", $payitem);$order_id = $payitem[0]; //// 订单状态$status = UserOrder::STATUS_BUY;//判断订单状态是否已经支付$userOrder = UserOrder::find()->where(['status' => $status, 'deal_number' => $innerOno])->exists();if ($userOrder) {throw new \Exception('订单已支付');}// 变更订单属性UserOrder::changeAttribute(['order_id' => $order_id],['status' => $status,'paid_at' => time(), //支付时间'cftid' => $cftid,]);$trans->commit();//返回给客户端数据,客户端会根据该结果处理米大师中该订单状态$result = ['ret' => 0,'msg' => 'OK',];} else {throw new \Exception('签名校验失败');}} catch (\Exception $e) {$result = ['ret' => -5,'msg' => $e->getMessage(),];$trans->rollBack();}echo json_encode($result);}

5.上面需要使用到的公共方法

/*** 操作成功* @example1 jsonSuccess();*/
function jsonSuccess($data = NULL, $message = '操作成功')
{header("Content-Type:application/json");$json = array();$json['code'] = 0;$json['data'] = $data;$json['message'] = $message;$json['request_time'] = now();echo Json::encode($json);exit();
}/*** 错误信息* @example1 jsonFail();* @example1 jsonFail("删除失败!");* @example2 jsonFail($model->getErrors());*/
function jsonFail($message = '请求失败', $code = 1, $data = null)
{header("Content-Type:application/json");$json = array();$json['code'] = $code;$json['data'] = $data;$json['message'] = $message;$json['request_time'] = now();echo Json::encode($json);exit();
}/*** 过滤掉特殊的字符* @param $str* @param string $replacement* @return string|string[]|null*/
function replaceStr($str, $replacement = '')
{$regex = "/\/|\~|\,|\。|\!|\?|\“|\”|\【|\】|\『|\』|\:|\;|\《|\》|\’|\‘|\ |\·|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\+|\{|\}|\:|\<|\>|\?|\[|\]|\,|\.|\/|\;|\'|\`|\-|\=|\\\|\|/";$result = preg_replace($regex, $replacement, $str);return $result;
}
Yii2 腾讯应用宝米大师相关配置:params-local.php
<?phpreturn [//腾讯应用宝'tencent.app' => [//腾讯应用平台,米大师沙箱,现网'tx_midas_is_sandbox' => 1,//腾讯应用平台,米大师沙箱AppKey'tx_midas_sandbox_app_key' => 'xxx',//腾讯应用平台,米大师现网AppKey'tx_midas_now_app_key' => 'xxx','pay_test' => 1, //是否支付测试'is_screen_pay' => 0, //是否屏蔽支付],
];
腾讯应用宝米大师支付SDK下载:链接: https://pan.baidu.com/s/1o93e9IkRajVzwwSI1Z3Lkg 提取码: sko1

参考文档:

YSDK介绍:https://wikinew.open.qq.com/index.html#/iwiki/847226339

米大师国内标准版: https://wiki.midas.qq.com/post/index/1/45/82/0

SDK下载文档:https://wikinew.open.qq.com/index.html#/iwiki/877913496

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/40700.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费好用的划词搜题神器插件

年初疫情爆发至今&#xff0c;可能不少家长头疼坏了-因为小孩的教育突然成了家长们巨大的烦恼&#xff0c;面对漫天飞的试题和教辅&#xff0c;不知道多少家长疲于应付&#xff0c;今天分享一个可以在浏览器中进行划词搜题的插件&#xff0c;不光可以一定程度上缓解家长们的教育…

网页搜题插件使用

安装划词搜题 根据自己的浏览器类型查看安装指南 一、Chrome浏览器(谷歌浏览器) 1、下载划词搜题安装文件 Chrome版划词搜题扩展下载地址2、解压安装文件 3、Chrome浏览器地址栏打开 chrome://extensions/ ,然后打开开发者模式,点击加载已解压的扩展程序,选择上一步中解压…

纬衡多个用户荣获“第五届建筑创作奖”

2008年12月&#xff0c;“第五届建筑创作奖”正式产生。 “第五届建筑创作奖”评奖办公室共收到全国18个省、市、自治区67个建筑设计研究单位申报的建筑创作项目248个。经过严格遵照公开、公正和公平的评选和无记名的投票&#xff0c;最后确定北京市建筑设计研究院之“国家大剧…

主要股东近3年净买入排名

主要股东在此区间内的净买入排名&#xff1a; 到 2019-08-08。 主要股东是指&#xff1a;公司管理层、机构和重要的个人股东。 来源&#xff1a;主要股东近3年净买入排名 1 - 中国建筑(SH601668) - 净买入&#xff1a;172.33亿 - 占A股流通市值比&#xff1a;7.493% - 市盈率…

“1024”讲话两个月后,深交所正式发布区块链50指数,板块再迎利好

“业务领域涉及区块链产业上中下游的公司为选样空间&#xff0c;按近半年日均总市值从高到低排序&#xff0c;筛选排名前50名的股票构成样本股。” 本文来源&#xff1a;巴比特&#xff1b;作者&#xff1a;邱祥宇&#xff1b;该内容旨在传递更多市场信息&#xff0c;不构成任何…

【12月19日】传媒行业的股票排名

便宜指数为PE、PB、股息和ROE四因子等权相加的值&#xff0c;越大代表越低估。 来源&#xff1a;传媒行业的股票排名 中原传媒(SZ000719)&#xff0c; 便宜指数&#xff1a; 7.21&#xff0c; 扣非市盈率(PE)&#xff1a;9.9&#xff0c; 股息&#xff1a; 3.46%&#xff0c; …

首次!深交所发布区块链50指数,成分股总市值1.3万亿

作者&#xff1a;邱祥宇 12月24日&#xff0c;深圳证券交易所和深圳证券信息有限公司发布深证区块链50指数&#xff08;指数代码&#xff1a;399286&#xff09;&#xff0c;以反映深圳证券市场区块链产业相关公司的表现和丰富指数化投资工具。指数基点为1000点&#xff0c;24日…

正好股票开户核污染主概念简直通杀

周三两市成交6440亿&#xff0c;比昨日又少了200多亿&#xff0c;指数弱反弹收涨0.6%。盘前券商给予中国中免买入评级&#xff0c;竟然真被拉出大阳&#xff0c;白酒企稳&#xff0c;给了指数支撑。破位下行&#xff0c;一个研报就吹起来&#xff0c;明日预期不太达观。 短线方…

特斯拉要对车内数据服务收费了:年费100美元;百度14.43亿投资东软,又在长沙投入45辆自动驾驶出租车;途歌倒闭消失了......

整理&#xff1a; 数据猿 Toby 数据猿官网 | www.datayuan.cn 今日头条丨一点资讯丨腾讯丨搜狐丨网易丨凤凰丨阿里UC大鱼丨新浪微博丨新浪看点丨百度百家丨博客中国丨趣头条丨腾讯云云社区 【目录精要】贵州将投资200亿元加快推进5G建设&#xff1b;数梦工场完成6亿元B轮融资&a…

陀螺产业区块链第九季 | 区块链+海关关务生态链

2020年4月&#xff0c;国家发改委在例行新闻发布会上宣布区块链被正式列为新型基础设施中的信息基础设施&#xff0c;自此区块链正式搭上新基建的“风口”。 从2020年到2021年&#xff0c;我国的区块链政策环境、基础设施建设、行业标准规范、技术研发实力、产业生态构建、行业…

天载正规股票数字货币逆势领涨

到午盘&#xff0c;上证指数跌1.18%&#xff0c;报3376.30点&#xff0c;深证成指跌1.38%&#xff0c;报13547.90点&#xff0c;创业板指跌1.39%&#xff0c;报2765.32点。 指数早盘震动走低&#xff0c;团体跌超1%&#xff0c;二胎概念开盘逆势领涨&#xff0c;数字钱银、白酒…

从腾讯的频繁增持看“游戏之王”的繁华和危情

近期&#xff0c;游戏圈真是热闹非凡。 特别是腾讯这个老牌游戏厂商&#xff0c;市场热度似乎从未消减。 近日&#xff0c;腾讯的操作可谓是让群众吃饱了瓜&#xff0c;原由竟是腾讯律师口出狂言&#xff1a;“玩家不是我们的重心”&#xff0c;一时间“腾讯与DD373”事件冲上…

百舸争流,盘点我国主流区块链企业联盟链技术与应用

文/尹宁 出品/陀螺研究院 区块链&#xff08;blockchain&#xff09;是一种由多方共同维护&#xff0c;使用密码学保证传输和访问安全&#xff0c;能够实现数据一致存储、难以篡改、防止抵赖的记账技术。2020年10月15号&#xff0c;美国白宫发布《关键与新兴技术国家战略》&…

申宝策略-元宇宙板块拉升

上午各大指数震荡反弹&#xff0c;创业板指数领涨。盘面上&#xff0c;云游戏、传媒、元宇宙、知识产权保护、虚拟现实等板块涨幅前列&#xff0c;盐湖提锂、物流、港口航运、煤炭等板块跌幅居前。 板块上&#xff0c;游戏板块大幅走强&#xff0c;新国脉、凯撒文化、惠程科技、…

申宝公司-A股开门红落空

2022年A股开门红落空&#xff0c;今日三大指数高开后震荡下挫&#xff0c;其中深成指跌超1%&#xff0c;创业板指重挫逾2%&#xff0c;午前市场小幅出现反弹&#xff1b;午后A股进一步回暖后再度走弱&#xff0c;三大指数集体收跌。沪深连续3个交易日破万亿&#xff1b;北向资金…

烧脑语言Brainfuck及其加减乘除

Brainfuck&#xff0c;文如其名&#xff0c;为“烧脑”而生&#xff0c;简称BF。 BF由Urban Mller于1993年创建&#xff0c;是满足图灵完备性(Turing complete)的一种极小化的计算机语言。 小到什么程度&#xff1f; BF一共只有8种符号 <>-.,[] &#xff0c;编译器也只有…

前端面试题

前端面试题 目录 前端面试题React相关1.说说React生命周期中有哪些坑&#xff1f;为什么要溢出will相关生命周期2. 说说Real diff算法是怎么运作的&#xff0c;从tree层到component层到element层分别讲解&#xff1f;3.调和阶段setState干了什么4.css3的新特性都有哪些5.说说re…

李德毅院士:人工智能看哲学

Datawhale干货 作者&#xff1a;李德毅院士&#xff0c;来源&#xff1a;图灵人工智能 作者简介&#xff1a;李德毅&#xff0c;中国人民解放军军事科学院研究员&#xff0c;中国工程院院士&#xff0c;国际欧亚科学院院 士。研究方向为计算机工程、不确定性人工智能、数据挖掘…

李德毅 | 人工智能看哲学

来源&#xff1a;图灵人工智能 作者&#xff1a;李德毅 中国人民解放军军事科学院研究员、中国工程院院士、国际欧亚科学院院士 摘要&#xff1a;本文探讨哲学和神学、科学之间的关系&#xff0c;探讨智慧和智能的关系&#xff1b;认为哲学不是科学&#xff0c;也不是科学的科学…