分账有
服务商分账
和普通商户分账
,服务商下的单服务商分账,普通商户下的单普通商户分账。但目前服务商还不能绑定APPID
,所以服务商不能用小程序下单(会报签名错误)。我就用的普通商户下的单,普通商户分的帐。
1.流程图
2.普通商户分账
1.开通分账功能
开通分账功能,产品中心->我的产品->分账,开通后产品设置,设置分账比例
2.添加分账接收方
添加分账接收方,也可以通过接口管理。交易中心->管理分账接收方。分账发起方选择本商户。点击添加分账接收方
3.根据开发文档分账
3.开发注意
1.下单添加字段profit_sharing
实现分账只是在普通支付下单接口中新增了一个分账参数profit_sharing,其他与普通支付方式完全相同。目前支持付款码支付、JSAPI支付、Native支付、APP支付、小程序支付、H5支付、委托代扣。
$result_data = [
'body' => '分账测试支付',
'out_trade_no' => '订单号',
'openid' => $openid, // $openid
'total_fee' => '888',
'notify_url' => 'https:xxx.xxx.com/wx_notify_url', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
'trade_type' => 'JSAPI',
'profit_sharing' => 'Y', // 是否指定服务商分账 Y-是,需要分账/N-否,不分账/字母要求大写,不传默认不分账
];
2.签名加密使用的是HMAC-SHA256
PHP
示例
/**
* Created by PhpStorm.
* User: EricPan
* Date: 2020/3/18
* Time: 17:31
* @param $attributes
* @param $key
* @param string $algo
* @return string
*/
function wxHash($attributes,$key,$algo = 'sha256')
{
ksort($attributes);
$attributes['key'] = $key;
$str = hash_hmac($algo,urldecode(http_build_query($attributes)),$key);
return strtoupper($str);
}
3.XML
编码解码
- 编码
/**
* 数组转XML
* Created by PhpStorm.
* User: EricPan
* Date: 2020/3/18
* Time: 14:08
* @param $data
*/
function wxDataToXML($data,$k = 'xml')
{
$xml = "<".$k.">";
foreach ($data as $key => $val){
if (is_numeric($val)){
$xml.="<$key>$val</$key>";
}
else
{
$xml.="<$key><![CDATA[$val]]></$key>";
}
}
$xml.="</".$k.">";
return $xml;
}
- 解码
/**
* 微信XML转数组
* Created by PhpStorm.
* User: EricPan
* Date: 2020/3/18
* Time: 14:07
* @param $xml
* @return mixed
*/
function wxXMLToData($xml)
{
return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
}
4.证书使用
在
curl
发起请求的时候使用。在微信商户平台->账户中心->API安全->申请API证书
/**
* 微信POST请求
* Created by PhpStorm.
* User: EricPan
* Date: 2020/3/18
* Time: 13:59
* @param $url
* @param string $type
* @return mixed
*/
public static function wxFPost($url,$data,$useCert = false)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, wxDataToXML($data));
if ($useCert == true) {
// 设置证书
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem');
curl_setopt($ch, CURLOPT_SSLCERT, 'apiclient_cert.pem');
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem');
curl_setopt($ch, CURLOPT_SSLKEY, 'apiclient_key.pem');
}
else
{
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
$xml = curl_exec($ch);
curl_close($ch);
return wxXMLToData($xml);
}