mkv是什么格式-window open 参数

微信支付分怎么开通
2023年4月6日发(作者:filesystemobject)

微信⽀付之特约商户⽀付

记录⼀下踩过的坑吧。

项⽬⾥对接微信特约商户⽀付差不多是⼀年前了吧,很多东西都忘了,刚好今天在新项⽬⾥调试这⼀块,然后掉坑⾥了。

⽐较久的⼀些坑以后再说,就先记录⼀下今天的坑吧。

这⾥以php,微信最新的sdk为例。

先说说第⼀个坑。

微信⽀付开发⽂档(境内)分普通商户版、服务商版、银⾏服务商版,这⾥只讨论前两个,两者区别的话就是在接⼝上的⼀些参数不同,⽐

如服务商版在调⽤统⼀⽀付API的时候需要填写sub_app_id,sub_mch_id之类的,这没什么,加上就是了,如果⾃⼰从0开始写的话那没

什么,如果使⽤微信的SDK的话就要注意了,普通商户版和服务商版提供的SDK同样都是普通商户版的SDK,这就意味着,如果你要对接

服务商版,缺失的参数以及对应的设置⽅法获取⽅法需要你⾃⼰在SDK⾥添加好,否则不成功,⽐如前⾯提到的

sub_app_id,sub_mch_id。

贴上⼀段代码:

publicstaticfunctionunifiedOrder($config,$inputObj,$timeOut=6)

{

$url="/pay/unifiedorder";

//检测必填参数

if(!$inputObj->IsOut_trade_noSet()){

thrownewWxPayException("缺少统⼀⽀付接⼝必填参数out_trade_no!");

}elseif(!$inputObj->IsBodySet()){

thrownewWxPayException("缺少统⼀⽀付接⼝必填参数body!");

}elseif(!$inputObj->IsTotal_feeSet()){

thrownewWxPayException("缺少统⼀⽀付接⼝必填参数total_fee!");

}elseif(!$inputObj->IsTrade_typeSet()){

thrownewWxPayException("缺少统⼀⽀付接⼝必填参数trade_type!");

}

//关联参数

if($inputObj->GetTrade_type()=="JSAPI"&&!$inputObj->IsOpenidSet()){

thrownewWxPayException("统⼀⽀付接⼝中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!");

}

if($inputObj->GetTrade_type()=="NATIVE"&&!$inputObj->IsProduct_idSet()){

thrownewWxPayException("统⼀⽀付接⼝中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!");

}

//异步通知url未设置,则使⽤配置⽂件中的url

if(!$inputObj->IsNotify_urlSet()&&$config->GetNotifyUrl()!=""){

$inputObj->SetNotify_url($config->GetNotifyUrl());//异步通知url

}

$inputObj->SetAppid($config->GetAppId());//公众账号ID

$inputObj->SetMch_id($config->GetMerchantId());//商户号

$inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//终端ip

$inputObj->SetNonce_str(self::getNonceStr());//随机字符串

//签名

$inputObj->SetSign($config);

$xml=$inputObj->ToXml();

$startTimeStamp=self::getMillisecond();//请求开始时间

$response=self::postXmlCurl($config,$xml,$url,false,$timeOut);

$result=WxPayResults::Init($config,$response);

self::reportCostTime($config,$url,$startTimeStamp,$result);//上报请求花费时间

return$result;

}

这是微信⽀付SDK中统⼀下单接⼝⽅法,其中$inputObj在普通商户下这样⽤是没问题的,但是到了服务商版本,有了如下区别:

先来看看服务商⽀付所需要的参数(摘⾃):

字段

变量名

类型⽰例值描述

服务商

APPID

appid是String(32)wx8888888888888888服务商商户的APPID

商户号mch_id是String(32)1900000109微信⽀付分配的商户号

⼦商户

公众账

号ID

sub_appid否String(32)wx8888888888888888

微信分配的⼦商户公众账号ID,如需在⽀付完成后

获取sub_openid则此参数必传。

⼦商户

sub_mch_id是String(32)1900000109微信⽀付分配的⼦商户号

设备号device_info否String(32)764

终端设备号(门店号或收银设备ID),注意:PC⽹页

或JSAPI⽀付请传"WEB"

开发票

⼊⼝开

放标识

receipt否String(8)Y

Y,传⼊Y时,⽀付成功消息和⽀付详情页将出现

开票⼊⼝。需要在微信⽀付商户平台或微信公众平

台开通电⼦发票功能,传此字段才可⽣效

随机字

符串

nonce_str是String(32)5K8264ILTKCH16CQ2502SI8ZNMTM67VS随机字符串,不长于32位。推荐

签名sign是String(64)C380BEC2BFD727A4B6845133519F3AD6签名,详见

签名类

sign_type否String(32)HMAC-SHA256

签名类型,⽬前⽀持HMAC-SHA256和MD5,默

认为MD5

商品描

body是String(128)腾讯充值中⼼-QQ会员充值

商品描述交易字段格式根据不同的应⽤场景

建议按照以下格式上传:

(1)PC⽹站——传⼊浏览器打开的⽹站主

页title名-实际商品名称,例如:腾讯充值中

⼼-QQ会员充值;

(2)公众号——传⼊公众号名称-实际商品

名称,例如:腾讯形象店-image-QQ公

仔;

(3)H5——应⽤在浏览器⽹页上的场

景,传⼊浏览器打开的移动⽹页的主页title

名-实际商品名称,例如:腾讯充值中⼼-QQ

会员充值;

(4)线下门店——门店品牌名-城市分店

名-实际商品名称,例如:image形象店-深

圳腾⼤-QQ公仔)

(5)APP——需传⼊应⽤市场上的APP名

字-实际商品名称,天天爱消除-游戏充值。

商品详

detail否String(6000)

商品详细描述,对于使⽤单品优惠的商户,改字段

必须按照规范上传,详见

附加数

attach否String(127)说明

附加数据,在查询API和⽀付通知中原样返回,该

字段主要⽤于商户携带订单的⾃定义数据

商户订

单号

out_trade_no是String(32)68018

商户系统内部订单号,要求32个字符内,只能是

数字、⼤⼩写字母_-|*且在同⼀个商户号下唯⼀。

详见

货币类

fee_type否String(16)CNY

符合ISO4217标准的三位字母代码,默认⼈民

币:CNY,其他值列表详见

总⾦额total_fee是Int888订单总⾦额,只能为整数,详见

终端IPspbill_create_ip是String(64)123.12.12.123

⽀持IPV4和IPV6两种格式的IP地址。调⽤微信⽀

付API的机器IP

交易起

始时间

time_start否String(14)20

订单⽣成时间,格式为yyyyMMddHHmmss,如

2009年12⽉25⽇9点10分10秒表⽰为

20。其他详见

交易结

束时间

time_expire否String(14)20

订单失效时间,格式为

yyyyMMddHHmmss,如2009年12⽉

27⽇9点10分10秒表⽰为

20。订单失效时间是针

对订单号⽽⾔的,由于在请求⽀付的时候有

⼀个必传参数prepay_id只有两⼩时的有效

期,所以在重⼊时间超过2⼩时的时候需要

重新请求下单接⼝获取新的prepay_id。其

他详见

time_expire只能第⼀次下单传值,不允许⼆次修

改,⼆次修改系统将报错。如⽤户⽀付失败后,需

再次⽀付,需更换原订单号重新下单。

建议:最短失效时间间隔⼤于1分钟

订单优

惠标记

goods_tag否String(32)WXG

订单优惠标记,代⾦券或⽴减优惠功能的参数,说

明详见

通知地

notify_url是String(256)/wxpay/

接收微信⽀付异步通知回调地址,通知url必须为

直接可访问的url,不能携带参数。

交易类

trade_type是String(16)JSAPI

JSAPI-JSAPI⽀付

NATIVE-Native⽀付

APP-APP⽀付

说明详见

商品IDproduct_id否String(32)

trade_type=NATIVE时,此参数必传。此id为⼆

维码中包含的商品ID,商户⾃⾏定义。

指定⽀

付⽅式

limit_pay否String(32)no_creditno_credit--指定不能使⽤信⽤卡⽀付

⽤户标

openid否String(128)oUpF8uMuAJO_M2pxb1Q9zNjWeS6o

trade_type=JSAPI,此参数必传,⽤户在主商户

appid下的唯⼀标识。openid和sub_openid可以

选传其中之⼀,如果选择传sub_openid,则必须传

sub_appid。下单前需要调⽤【】接⼝获取到⽤户

的Openid。

⽤户⼦

标识

sub_openid否String(128)oUpF8uMuAJO_M2pxb1Q9zNjWeS6o

trade_type=JSAPI,此参数必传,⽤户在⼦商户

appid下的唯⼀标识。openid和sub_openid可以

选传其中之⼀,如果选择传sub_openid,则必须传

sub_appid。下单前需要调⽤【】接⼝获取到⽤户

的Openid。

电⼦发

票⼊⼝

开放标

receipt否String(8)Y

Y,传⼊Y时,⽀付成功消息和⽀付详情页将出现

开票⼊⼝。需要在微信⽀付商户平台或微信公众平

台开通电⼦发票功能,传此字段才可⽣效

+场景

信息

scene_info否String(256)

{"store_info":{

"id":"SZTX001",

"name":"腾⼤餐厅",

"area_code":"440305",

"address":"科技园中⼀路腾讯⼤厦"}}

该字段常⽤于线下活动时的场景信息上报,

⽀持上报实际门店信息,商户也可以按需求

⾃⼰上报相关信息。该字段为JSON对象数

据,对象格式为{"store_info":{"id":"门店

ID","name":"名称","area_code":"编

码","address":"地址"}},字段详细说明请

点击⾏前的+展开

再来看看普通商户所需要的参数(摘⾃):

字段

变量名

类型⽰例值描述

公众

账号

ID

appid是String(32)wxd678efh567hg6787

微信⽀付分配的公众账号ID(企业号corpid即为此

appId)

商户

mch_id是String(32)1230000109微信⽀付分配的商户号

设备

device_info否String(32)764

⾃定义参数,可以为终端设备号(门店号或收银设备

ID),PC⽹页或公众号内⽀付可以传"WEB"

随机

字符nonce_str是String(32)5K8264ILTKCH16CQ2502SI8ZNMTM67VS随机字符串,长度要求在32位以内。推荐

签名sign是String(32)C380BEC2BFD727A4B6845133519F3AD6通过签名算法计算得出的签名值,详见

签名

类型

sign_type否String(32)MD5

签名类型,默认为MD5,⽀持HMAC-SHA256和

MD5。

商品

描述

body是String(128)腾讯充值中⼼-QQ会员充值

商品简单描述,该字段请按照规范传递,具体

请见

商品

详情

detail否String(6000)

商品详细描述,对于使⽤单品优惠的商户,该字段必

须按照规范上传,详见

附加

数据

attach否String(127)深圳分店

附加数据,在查询API和⽀付通知中原样返回,可作

为⾃定义参数使⽤。

商户

订单

out_trade_no是String(32)26

商户系统内部订单号,要求32个字符内,只能是数

字、⼤⼩写字母_-|*且在同⼀个商户号下唯⼀。详见

标价

币种

fee_type否String(16)CNY

符合ISO4217标准的三位字母代码,默认⼈民币:

CNY,详细列表请参见

标价

⾦额

total_fee是Int88订单总⾦额,单位为分,详见

终端

IP

spbill_create_ip是String(64)123.12.12.123

⽀持IPV4和IPV6两种格式的IP地址。⽤户的客户端

IP

交易

起始

时间

time_start否String(14)20

订单⽣成时间,格式为yyyyMMddHHmmss,如

2009年12⽉25⽇9点10分10秒表⽰为

20。其他详见

交易

结束

时间

time_expire否String(14)20

订单失效时间,格式为

yyyyMMddHHmmss,如2009年12⽉27

⽇9点10分10秒表⽰为

20。订单失效时间是针对

订单号⽽⾔的,由于在请求⽀付的时候有⼀个

必传参数prepay_id只有两⼩时的有效期,所

以在重⼊时间超过2⼩时的时候需要重新请求

下单接⼝获取新的prepay_id。其他详见

time_expire只能第⼀次下单传值,不允许⼆次修

改,⼆次修改系统将报错。如⽤户⽀付失败后,需再

次⽀付,需更换原订单号重新下单。

建议:最短失效时间间隔⼤于1分钟

订单

优惠

标记

goods_tag否String(32)WXG

订单优惠标记,使⽤代⾦券或⽴减优惠功能时需要的

参数,说明详见

通知

地址

notify_url是String(256)/wxpay/

异步接收微信⽀付结果通知的回调地址,通知url必

须为外⽹可访问的url,不能携带参数。

交易

类型

trade_type是String(16)JSAPI

JSAPI-JSAPI⽀付

NATIVE-Native⽀付

APP-APP⽀付

说明详见

商品

ID

product_id否String(32)

trade_type=NATIVE时,此参数必传。此参数为⼆

维码中包含的商品ID,商户⾃⾏定义。

指定

⽀付

⽅式

limit_pay否String(32)no_credit

上传此参数no_credit--可限制⽤户不能使⽤信⽤卡

⽀付

trade_type=JSAPI时(即JSAPI⽀付),此参数必

字段

变量名

类型⽰例值描述

⽤户

标识

openid否String(128)oUpF8uMuAJO_M2pxb1Q9zNjWeS6o

传,此参数为微信⽤户在商户对应appid下的唯⼀标

识。openid如何获取,可参考【】。企业号请使⽤

【】获取企业号内成员userid,再调⽤【】进⾏转

电⼦

发票

⼊⼝

开放

标识

receipt否String(8)Y

Y,传⼊Y时,⽀付成功消息和⽀付详情页将出现开

票⼊⼝。需要在微信⽀付商户平台或微信公众平台开

通电⼦发票功能,传此字段才可⽣效

+场

景信

scene_info否String(256)

{"store_info":{

"id":"SZTX001",

"name":"腾⼤餐厅",

"area_code":"440305",

"address":"科技园中⼀路腾讯⼤厦"}}

该字段常⽤于线下活动时的场景信息上报,⽀

持上报实际门店信息,商户也可以按需求⾃⼰

上报相关信息。该字段为JSON对象数据,对

象格式为{"store_info":{"id":"门店

ID","name":"名称","area_code":"编

码","address":"地址"}},字段详细说明请点

击⾏前的+展开

字段

变量名

类型⽰例值描述

这⾥就很明显看得出来⼆者的区别,服务商⽀付需要服务商的appid和服务商的mch_id,然后多了sub_app_id、sub_mch_id、

sub_openid。

按照SDK的写法,这三个值应该有对应的设置⽅法和读取⽅法:

$inputObj->SetSubAppid();

$inputObj->SetSubMch_id();

$inputObj->SetSubOpen_id();

然⽽,并没有。甚⾄我在整个SDK⾥搜索sub这三个字母都⽆结果。所以这⾥需要我们⾃⼰去添加对应的⽅法。emmmmmm这算是个

⼩坑吧,⾃⼰改改就完。

然后说回这仨值,这仨值是必填!必填!必填!否则报错,⽽⽂档⾥sub_app_id、sub_openid的必填属性为否。

嗯,好,以上的都没啥问题了,后边签名⼜过不去了,看(服务商版):

嗯,没⽑病,不过怎么看着就⾯熟呢?再看看:

这特么不⼀个样么?不都是按照ASCII码从⼩到⼤排序拼接然后拼上商户密钥key最后md5运算转换⼤写么?为什么我就是不通过?

那么,坑来了,这个商户密钥key,服务商版的需要⽤服务商的商户密钥key,⽽不是⼦商户的。

好的,换上了服务商的key,通过了,也获取到了前端调起⽀付需要的xml数据了,然后兴冲冲拿着这些数据去进⾏签名处理好发给前

端调起⽀付了,然后前端也确实得到了timeStamp、nonceStr、package、signType、paySign这五个参数(以⼩程序为例),然后前端

也兴冲冲的拿起⼿机扫码付款了,这时候突然⼿机上⼀个弹窗:⽀付签名验证失败。然后⼀下⼦就从天上掉下来了,为什么?不是签名通过

了么?参数也都全啊?怎么就⼜签名失败了?

于是跑回去各种检查各种尝试,然后对⽐检查到了签名这⼀块:appid、timeStamp、nonceStr、package、signType都设置了

啊,package也按要求prepay_id=的⽅式填写了啊,到底怎么回事?恭喜⼜踩坑了,这⾥的appid不能使⽤服务商的,⽽是使⽤⼦商户的,

也就是sub_app_id。

改完参数后,emmmmmmm成了。

以上是付款遇到的坑,emmmmm还有退款,年代久远都忘了,等新项⽬对接到了再说吧,⼜得头疼⼀阵⼦。

更多推荐

微信支付分怎么开通