微信商户平台登录后,在产品中心,开通“商家转账到零钱”。
在“商家转账到零钱-前往功能”中设置转账场景。
只有调用接口就好。
发起商家转账 - 商家转账到零钱 | 微信支付商户文档中心
字段 | 必填 | 说明 |
Authorization | 是 | 签名内容 |
Accept | 是 | 值为:application/json |
Content-Type | 是 | 值为:application/json |
Wechatpay-Serial | 是 | 敏感字段加密 |
签名生成-接口规则 | 微信支付商户平台文档中心
签名用字段如下
字段 | 必填 | 说明 |
http请求方法 | 是 | post get put 等 有报文内容使用post. 无报文内容使用get. 图片上传API,请使用meta对应的JSON报文 |
请求url | 是 | 获取请求的绝对URL,并去除域名部分得到参与签名的URL。如果请求中有查询参数,URL末尾应附加有'?'和对应的查询字符串 |
请求时间戳 | 是 | 获取发起请求时的系统当前时间戳 微信支付会拒绝处理很久之前发起的请求,请商户保持自身系统的时间准确。 |
请求随机字符串 | 是 | 生成一个请求随机串 根据之前处理微信支付的经验,随机字符串不能重复使用。 |
报文主体 | 否 |
$url_parts = parse_url($url);
$canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
$message = $http_method."\n".//请求方法
$canonical_url."\n".//请求url
$timestamp."\n".//时间戳
$nonce."\n".//随机字符串
$body."\n";//报文主体
//使用商户私钥对待签名串进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值。
openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
//$row_sign 为待签名的值
$sign = base64_encode($raw_sign);//签名值
Authorization: 认证类型 签名信息
1.认证类型,目前为WECHATPAY2-SHA256-RSA2048
2.签名信息
注:以上五项签名信息,无顺序要求。
mchid
序列号serial_no
,用于声明所使用的证书nonce_str
timestamp
signature
// Authorization:
$schema = 'WECHATPAY2-SHA256-RSA2048';
$token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
$merchant_id, $nonce, $timestamp, $serial_no, $sign);
获取serial_no:获取平台证书列表-文档中心-微信支付商户平台
设置api证书:什么是商户API证书?如何获取商户API证书?
取得微信支付平台证书(api证书)中的公钥,对上送的敏感信息进行加密。
微信支付使用 商户证书中的公钥对下行的敏感信息进行加密。开发者应使用商户私钥对下行的敏感信息的密文进行解密。
function getEncrypt($str) {
//$str是待加密字符串
$public_key_path = '平台证书路径';
$public_key = file_get_contents($public_key_path);//证书公钥
$encrypted = '';
if (openssl_public_encrypt($str, $encrypted, $public_key, OPENSSL_PKCS1_OAEP_PADDING)) {
//base64编码
$sign = base64_encode($encrypted);
} else {
throw new Exception('encrypt failed');
}
return $sign;
}
2.3.2 解密示例
$public_key_path = '平台证书路径';
$public_key = file_get_contents($public_key_path);//证书私钥
$res2 = openssl_private_decrypt($str, $encrypted, $public_key, OPENSSL_PKCS1_PADDING );
if(!$res2) {
echo '解密失败!';
exit;
}
详见:发起商家转账 - 商家转账到零钱 | 微信支付商户文档中心
对应参数的内容主要是业务方面的数据。
字段 | 必填 | 说明 |
appid | 是 | 商户appid 申请商户号的appid或商户号绑定的appid(企业号corpid即为此appid) |
out_batch_no | 是 | 商家批次单号 商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一 |
batch_name | 是 | 批次名称 该笔批量转账的名称 |
batch_remark | 是 | 批次备注 转账说明,UTF8编码,最多允许32个字符 |
total_amount | 是 | 转账总金额 转账金额单位为“分”。转账总金额必须与批次内所有明细转账金额之和保持一致,否则无法发起转账操作 |
total_num | 是 | 转账总笔数 最多发起一千笔转账。转账总笔数必须与批次内所有明细之和保持一致,否则无法发起转账操作 |
transfer_detail_list | 是 | 转账明细列表 数组 起批量转账的明细列表,最多一千笔 |
transfer_scene_id | 否 | 转账场景ID 如不填写则使用商家的默认场景,如无默认场景可为空,可前往“商家转账到零钱-前往功能”中申请。 |
transfer_detail_list
字段 | 必填 | 说明 |
out_detail_no | 是 | 商家明细单号 商户系统内部区分转账批次单下不同转账明细单的唯一标识,要求此参数只能由数字、大小写字母组成 |
transfer_amount | 是 | 转账金额 转账金额单位为“分” |
transfer_remark | 是 | 转账备注 单条转账备注(微信用户会收到该备注),UTF8编码,最多允许32个字符 |
openid | 是 | 收款用户openid 商户appid下,某用户的openid |
user_name | 否 | 收款用户姓名 收款方真实姓名。支持标准RSA算法和国密算法,公钥由微信侧提供 |
若一次仅一笔,且小于2000元,建议user_name不用填。但是不排除系统里一个openid对应两个人的情况。比如一个openid对应两个手机号,到时候用户认为自己没收到钱,也是麻烦事。鉴于此场景也能付款到银行卡:【微信支付】付款开发者文档
成功应答200
字段 | 必填 | 说明 |
out_batch_no | 是 | 商家批次单号 商户系统内部的商家批次单号,在商户系统内部唯一 即自定义的数据 |
batch_id | 是 | 微信批次单号 微信批次单号,微信商家转账系统返回的唯一标识 |
create_time | 是 | 批次创建时间 批次受理成功时返回,按照使用rfc3339所定义的格式,格式为YYYY-MM-DDThh:mm:ss+TIMEZONE |
batch_status | 否 | 批次状态 ACCEPTED:已受理。批次已受理成功,若发起批量转账的30分钟后,转账批次单仍处于该状态,可能原因是商户账户余额不足等。商户可查询账户资金流水,若该笔转账批次单的扣款已经发生,则表示批次已经进入转账中,请再次查单确认 |
查询转账批次单号:通过商家批次单号查询批次单 - 商家转账到零钱 | 微信支付商户文档中心
查询转账明细单号:通过商家明细单号查询明细单 - 商家转账到零钱 | 微信支付商户文档中心
加密解密:OpenSSL加密解密 · Laravel开发 · 看云
微信付款银行卡:微信企业转账到银行卡
以上内容均根据官方文档整理,具体情况待实践。下一篇上代码。