mkv是什么格式-window open 参数
![微信支付分怎么开通](/uploads/image/0933.jpg)
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还有退款,年代久远都忘了,等新项⽬对接到了再说吧,⼜得头疼⼀阵⼦。
更多推荐
微信支付分怎么开通
发布评论