• 微信分账-添加分账接收方v3


    参考:添加分账接收方API - 分账 | 微信支付服务商文档中心

    所需信息:

    微信支付平台证书、商户API证书、商户API私钥】【V3密钥、公众账号ID、运营方商户号、运营方商户api证书序列号、运营方微信支付平台证书序列号、随机串、当前时间戳、由签名值计算的签名串、分账接收方商户号、加密后的分账接收方商户名

    1、查看证书序列号 地址

    2、微信支付平台证书

    该证书只能通过接口获得,首次下载用命令下载比较好一些 下载工具

    1. /*首次下载*/
    2. java -jar CertificateDownloader.jar -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath}
    3. /*更新*/
    4. java -jar CertificateDownloader.jar -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath} -c ${wechatpayCertificateFilePath}
    5. /*参数*/
    6. 必需参数有:
    7. -f ,商户API私钥文件路径
    8. -k ,证书解密的密钥
    9. -m ,商户号
    10. -o ,保存证书的路径
    11. -s ,商户API证书的序列号
    12. 非必需参数有:
    13. -c ,微信支付平台证书的路径。如果你还没有证书,请先不传该参数。

    3、商户API证书、密钥 参考

    4、加密后的分账接收方商户名

    1. function getEncrypt($str) {
    2. //$str是待加密字符串
    3. $public_key_path = "平台证书地址";
    4. $public_key = file_get_contents($public_key_path);
    5. $encrypted = '';
    6. if (openssl_public_encrypt($str, $encrypted, $public_key, OPENSSL_PKCS1_OAEP_PADDING)) {
    7. //base64编码
    8. $sign = base64_encode($encrypted);
    9. } else {
    10. throw new Exception('encrypt failed');
    11. }
    12. return $sign;
    13. }

    5、由签名值计算的签名串

    1. POST\n
    2. /v3/profitsharing/receivers/add\n
    3. 时间戳\n
    4. 随机串\n
    5. json串{"appid" : "公众账号ID","type" : "MERCHANT_ID","account" : "分账接收方商户号","name" : "加密后的分账接收方商户名","relation_type" : "PARTNER"}\n

     6、添加请求

    1. curl -X POST \
    2. https://api.mch.weixin.qq.com/v3/profitsharing/receivers/add \
    3. -H "Authorization: WECHATPAY2-SHA256-RSA2048 mchid="运营方商户号",nonce_str="随机串",signature="由签名值计算的签名串",timestamp="当前时间戳",serial_no="运营方商户api证书序列号"\
    4. -H "Accept: application/json" \
    5. -H "Wechatpay-Serial: 运营方微信支付平台证书序列号" \
    6. -H "Content-Type: application/json" \
    7. -d '{
    8. "appid" : "公众账号ID",
    9. "type" : "MERCHANT_ID",
    10. "account" : "分账接收方商户号",
    11. "name" : "加密后的分账接收方商户名",
    12. "relation_type" : "PARTNER"
    13. }'

    完整代码

    1. header("Access-Control-Allow-Origin: *");
    2. $appid = '公众号appid';
    3. $nonce=getNonceStr();//"随机串"
    4. $serial_no = '商户API证书系列号';
    5. $mchid="运营方商户号";
    6. $timestamp = time();
    7. $private_key_path = "商户API密钥地址";
    8. $account = '分账接收方商户号';
    9. $str = "分账接收方商户名";
    10. $name = getEncrypt($str);//加密后的分账接收方商户名
    11. $url = 'https://api.mch.weixin.qq.com/v3/profitsharing/receivers/add';
    12. $data = '{"appid":"'.$appid.'","type":"MERCHANT_ID","account":"'.$account.'","name":"'.$name.'","relation_type":"PARTNER"}';
    13. /*由签名值计算的签名串*/
    14. $private_key = file_get_contents($private_key_path);//商户API密钥内容
    15. $url_parts = parse_url($url);
    16. $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
    17. $message = "POST".chr(10).$canonical_url.chr(10).$timestamp.chr(10).$nonce.chr(10).$data.chr(10);
    18. openssl_sign($message, $raw_sign, $private_key, 'sha256WithRSAEncryption');
    19. $sign = base64_encode($raw_sign);
    20. /*添加分账方*/
    21. $schema = 'WECHATPAY2-SHA256-RSA2048';
    22. $token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"', $mchid, $nonce, $timestamp, $serial_no, $sign);
    23. $ret = posturl($url,$data,$schema.' '.$token);
    24. print_r($ret);
    25. function posturl($url, $data, $Authorization){
    26. $wechatpay_no = "平台证书序列号";
    27. $headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json","Authorization:".$Authorization,"User-Agent:".$_SERVER['HTTP_USER_AGENT'],"Wechatpay-Serial:".$wechatpay_no);
    28. $curl = curl_init();
    29. curl_setopt($curl, CURLOPT_URL, $url);
    30. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    31. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
    32. curl_setopt($curl, CURLOPT_POST, 1);
    33. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    34. curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
    35. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    36. $output = curl_exec($curl);
    37. curl_close($curl);
    38. return $output;
    39. }
    40. function getEncrypt($str) {
    41. //$str是待加密字符串
    42. $public_key_path = "平台证书地址";
    43. $public_key = file_get_contents($public_key_path);
    44. $encrypted = '';
    45. if (openssl_public_encrypt($str, $encrypted, $public_key, OPENSSL_PKCS1_OAEP_PADDING)) {
    46. //base64编码
    47. $sign = base64_encode($encrypted);
    48. } else {
    49. throw new Exception('encrypt failed');
    50. }
    51. return $sign;
    52. }
    53. /**
    54. *
    55. * 产生随机字符串,不长于32位
    56. * @param int $length
    57. * @return 产生的随机字符串
    58. */
    59. function getNonceStr($length = 32)
    60. {
    61. $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
    62. $str = "";
    63. for ($i = 0; $i < $length; $i++) {
    64. $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    65. }
    66. return $str;
    67. }
    68. ?>

  • 相关阅读:
    Java18+​App端采用uniapp+开发工具 idea hbuilder智能上门家政系统源码,一站式家政服务平台开发家政服务
    Ubuntu篇——crontab修改编辑器
    一桩字符串长度引发的惨案
    Java基础面试题【1】
    centos7.9 扩容/根分区(扩根)
    Unity3d bounds包围盒 和collider碰撞器区别
    vue项目,PDA嵌入安卓,实现app热更新
    nginx反向代理端口后配置静态资源(页面)
    import * as用法
    Configuration of phpstudy and sqli-labs
  • 原文地址:https://blog.csdn.net/u013227399/article/details/133816958