当前位置:   article > 正文

PHP对接微信企业付款到零钱(简化版)_/mmpaymkttransfers/promotion/transfers

/mmpaymkttransfers/promotion/transfers

想要接入此接口, 首先得要有一个开通了企业付款到零钱功能的微信商户号 ,
具体的开通方法这里就不描述了

接口请求url : https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
需要商户号上面申请的api支付证书

先定义好几个参数

$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
$mch_appid = ''; //商户号appid
$mchid = '';     //商户号
$nonce_str = ''; //随机字符串,不长于32位
$partner_trade_no =  '';  //**商户唯一订单号 , 这里指的是提现订单
$check_name = 'NO_CHECK';  //不校验真实姓名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

参数定义好 , 且处理完你的相关业务逻辑之后 , 需要生成签名sign
签名参数如何生成请参考微信官方文档 : https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:

◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

$data = [
    'mch_appid'=>$mch_appid,
    'mchid'=>$mchid,
    'nonce_str'=>$nonce_str,
    'partner_trade_no'=>$partner_trade_no,
    'openid'=>$openid,
    'check_name'=>$check_name,
    'amount'=>$amount,
    'desc'=>$desc,
];

//生成签名算法
$data=array_filter($data);
ksort($data);
$str='';
foreach($data as $k=>$v) {
    $str.=$k.'='.$v.'&';
}
$str.='key='.$key;
$data['sign']=md5($str);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

生成签名sign之后 , 把参数数组转换为XML字符串

//php数组转换为xml格式数据
function arrayToXml($data){
    $xml = "<xml>";
    foreach ($data as $key=>$val){
        $xml.="<".$key.">".$val."</".$key.">";
    }
    $xml.="</xml>";
    return $xml;
}

$dataXML = arrayToXml($data);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

发起curl请求 , 注意这里要带上你的证书
这里我简单封装一个函数

/**
 * [curl_post_ssl 发送curl_post数据]
 * @param [type] $url  [发送地址]
 * @param [type] $xmldata [发送文件格式]
 * @param [type] $second [设置执行最长秒数]
 * @param [type] $aHeader [设置头部]
 * @return [type]   [description]
 */
function curl_post_ssl($url, $xmldata, $second = 30, $aHeader = array()){
    $isdir = ""; //填你微信API支付证书的绝对或相对路径的目录

    $ch = curl_init();//初始化curl

    curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置执行最长秒数
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
    curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 终止从服务端进行验证
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//
    curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');//证书类型
    curl_setopt($ch, CURLOPT_SSLCERT, $isdir . 'apiclient_cert.pem');//证书位置
    curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中规定的私钥的加密类型
    curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');//证书位置
    curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
    curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
    if (count($aHeader) >= 1) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
    }
    curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);//全部数据使用HTTP协议中的"POST"操作来发送

    $data = curl_exec($ch);//执行回话
    if ($data) {
        curl_close($ch);
        return $data;
    } else {
        $error = curl_errno($ch);
        echo "call faild, errorCode:$error\n";
        curl_close($ch);
        return false;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

发出请求之后 , 接受微信服务器传回的返回值XMl字符串 , 这里做些处理解析为数组

$result = curl_post_ssl($url,$dataXML);
$obj = simplexml_load_string($result,"SimpleXMLElement", LIBXML_NOCDATA);
$resultArr = json_decode(json_encode($obj),true);
  • 1
  • 2
  • 3

然后就可以根据你的项目具体需求 , 去处理业务逻辑了

if($resultArr['return_code'] == "SUCCESS"){//请求成功

    //判断业务结果 result_code  (SUCCESS/FAIL) ,非付款标识,
    if($resultArr['result_code'] == "SUCCESS"){
        // return_code 和result_code都为SUCCESS的时候 , 表示付款成功
        //企业付款成功处理的逻辑

        return;
    }elseif($resultArr['result_code'] == "FAIL"){
        //付款失败处理的逻辑

        return;
        //错误码信息,注意:出现未明确的错误码时(SYSTEMERROR等),请务必用原商户订单号重试,或通过查询接口确认此次付款的结果。
    }

}elseif($resultArr['return_code'] == "FAIL"){
	//请求失败处理的逻辑
	
    return ;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

完成 !
最后 , 我这里再附上微信企业付款到零钱的开发文档
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/122968
推荐阅读
相关标签
  

闽ICP备14008679号