微信支付企业付款(PHP)
本文于428天之前发表,文中内容可能已经过时。
企业付款为企业提供付款至用户零钱的能力,支持通过API接口付款,或通过微信支付商户平台(pay.weixin.qq.com)网页操作付款。配置和说明可以参考官方文档
实现方法
在微信官方SDK的WxPay.Api.php添加参考代码:
企业向个人付款
public function mchPay($params)
{
$url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
//检测必填参数
if($params["partner_trade_no"] == null) {
throw new WxPayException("企业付款申请接口中,缺少必填参数partner_trade_no!");
}else if($params["openid"] == null){
throw new WxPayException("企业付款申请接口中,缺少必填参数openid!");
}else if($params["check_name"] == null){
throw new WxPayException("企业付款申请接口中,缺少必填参数check_name!");
}else if($params["amount"] == null){
throw new WxPayException("企业付款申请接口中,缺少必填参数amount!");
}else if($params["desc"] == null){
throw new WxPayException("企业付款申请接口中,缺少必填参数desc!");
}
$params["mch_appid"] = WxPayConfig::APPID();//公众账号ID
$params["mchid"] = WxPayConfig::MCHID();//商户号
$params["nonce_str"] = self::getNonceStr();//随机字符串
$params['spbill_create_ip'] = $_SERVER['REMOTE_ADDR'] == '::1' ? '192.127.1.1' : $_SERVER['REMOTE_ADDR'];//获取IP
$obj = new \WxPayDataBase();
$params["sign"] = $this->MakeSign($params);//签名
$xml = $this->arrayToXml($params);
$response = self::postXmlCurl($xml, $url, true);
$obj->FromXml($response);
return $obj->GetValues();
}
//array转xml
public function arrayToXml($arr)
{
$xml = "<xml>";
foreach ($arr as $key=>$val)
{
if (is_numeric($val))
{
$xml.="<".$key.">".$val."</".$key.">";
}
else
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
$xml.="</xml>";
return $xml;
}
//生成签名
public function MakeSign($params)
{
//签名步骤一:按字典序排序参数
ksort($params);
$string = $this->ToUrlParams($params);
//签名步骤二:在string后加入KEY
$string = $string . "&key=".WxPayConfig::KEY();
//签名步骤三:MD5加密
$string = md5($string);
//签名步骤四:所有字符转为大写
$result = strtoupper($string);
return $result;
}
public function ToUrlParams($params)
{
$buff = "";
foreach ($params as $k => $v)
{
if($k != "sign" && $v != "" && !is_array($v)){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
调用示例:
$mchPay = new \WxPayApi();
$amount = '付款金额';//企业付款金额,单位“分”
$desc = '企业付款';//描述
$partner_trade_no = '订单号';
$openid = '用户oppenid';
$params = array(
'partner_trade_no' => $partner_trade_no,
'openid' => $openid,
'check_name' => 'NO_CHECK',//不校验姓名
'amount' => $amount,
'desc' => $desc,
);
$toPay = $mchPay->mchPay($params);
if($toPay["return_code"]=="SUCCESS"&&$toPay["result_code"]=="SUCCESS"){
/**
* 业务逻辑 数据库操作
*/
echo "付款成功";
}else{
//输出错误信息
echo $toPay['err_code'].$toPay['err_code_des'];
}