微信 商家转账到零钱 一

一 流程

微信商户平台登录后,在产品中心,开通“商家转账到零钱”。

在“商家转账到零钱-前往功能”中设置转账场景。

微信 商家转账到零钱 一_第1张图片

只有调用接口就好。

二 接口

发起商家转账 - 商家转账到零钱 | 微信支付商户文档中心

2.1 请求头

字段 必填 说明
Authorization 签名内容
Accept 值为:application/json
Content-Type 值为:application/json
Wechatpay-Serial 敏感字段加密

2.2 签名算法

签名生成-接口规则 | 微信支付商户平台文档中心

 签名用字段如下

字段 必填 说明
http请求方法

post get put 等

有报文内容使用post.

无报文内容使用get.

图片上传API,请使用meta对应的JSON报文

请求url 获取请求的绝对URL,并去除域名部分得到参与签名的URL。如果请求中有查询参数,URL末尾应附加有'?'和对应的查询字符串
请求时间戳

获取发起请求时的系统当前时间戳

微信支付会拒绝处理很久之前发起的请求,请商户保持自身系统的时间准确。

请求随机字符串

生成一个请求随机串

根据之前处理微信支付的经验,随机字符串不能重复使用。

报文主体

 2.2.1 签名算法

$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);//签名值

2.2.2 请求头设置

Authorization: 认证类型 签名信息

1.认证类型,目前为WECHATPAY2-SHA256-RSA2048

2.签名信息

注:以上五项签名信息,无顺序要求。

  • 发起请求的商户(包括直连商户、服务商或渠道商)的商户号 mchid
  • 商户API证书序列号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证书?

2.3 敏感字段加密

取得微信支付平台证书(api证书)中的公钥,对上送的敏感信息进行加密。

微信支付使用 商户证书中的公钥对下行的敏感信息进行加密。开发者应使用商户私钥对下行的敏感信息的密文进行解密

2.3.1 加密示例

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;
}

2.3 报文主体

详见:发起商家转账 - 商家转账到零钱 | 微信支付商户文档中心

对应参数的内容主要是业务方面的数据。

字段 必填 说明
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算法和国密算法,公钥由微信侧提供
明细转账金额<0.3元时,不允许填写收款用户姓名
明细转账金额 >= 2,000元时,该笔明细必须填写收款用户姓名
同一批次转账明细中的姓名字段传入规则需保持一致,也即全部填写、或全部不填写
若商户传入收款用户姓名,微信支付会校验用户openID与姓名是否一致,并提供电子回单

 若一次仅一笔,且小于2000元,建议user_name不用填。但是不排除系统里一个openid对应两个人的情况。比如一个openid对应两个手机号,到时候用户认为自己没收到钱,也是麻烦事。鉴于此场景也能付款到银行卡:【微信支付】付款开发者文档

2.4 回执

成功应答200

字段 必填 说明
out_batch_no

商家批次单号

商户系统内部的商家批次单号,在商户系统内部唯一

即自定义的数据

batch_id

微信批次单号

微信批次单号,微信商家转账系统返回的唯一标识

create_time

批次创建时间

批次受理成功时返回,按照使用rfc3339所定义的格式,格式为YYYY-MM-DDThh:mm:ss+TIMEZONE

batch_status

批次状态

ACCEPTED:已受理。批次已受理成功,若发起批量转账的30分钟后,转账批次单仍处于该状态,可能原因是商户账户余额不足等。商户可查询账户资金流水,若该笔转账批次单的扣款已经发生,则表示批次已经进入转账中,请再次查单确认
PROCESSING:转账中。已开始处理批次内的转账明细单
FINISHED:已完成。批次内的所有转账明细单都已处理完成
CLOSED:已关闭。可查询具体的批次关闭原因确认

查询转账批次单号:通过商家批次单号查询批次单 - 商家转账到零钱 | 微信支付商户文档中心

查询转账明细单号:通过商家明细单号查询明细单 - 商家转账到零钱 | 微信支付商户文档中心

三 参考

加密解密:OpenSSL加密解密 · Laravel开发 · 看云

微信付款银行卡:微信企业转账到银行卡

以上内容均根据官方文档整理,具体情况待实践。下一篇上代码。

你可能感兴趣的:(微信,微信)