/***********************企业支付到个人零钱***************************/
/**
* 企业支付到个人零钱
* @param string $openid 用户openID
* @param string $trade_no 单号
* @param string $money 金额
* @param string $desc 描述
* @return string XML 结构的字符串
*/
public static function pay($openid, $trade_no, $money, $desc)
{
$data = array(
'mch_appid' => 'wx122312', //appid。填写自己的
'mchid' => '1536545', //商户号。填写自己的
'nonce_str' => self::getNonceStr(), //随机字符串
'partner_trade_no' => $trade_no, //商户订单号,需要唯一
'openid' => $openid,
'check_name' => 'NO_CHECK', //OPTION_CHECK不强制校验真实姓名, FORCE_CHECK:强制 NO_CHECK:
'amount' => $money * 100, //付款金额单位为分
'desc' => $desc,
'spbill_create_ip' => '127.0.0.1', //尽量填写。其实影响不大
//'re_user_name' => '随便写,可以忽略', //收款人用户姓名 *选填
//'device_info' => '1000', //设备号 *选填
);
//生成签名
$data['sign'] = self::makeSign($data);
//构造XML数据
$xmldata = self::arrToXml($data);
// 请求URL
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
//发送post请求
$res = self::curl_post_ssl($url, $xmldata);
}
/**
* 随机字符串
* @param int $length
* @return string
*/
private static function getNonceStr($length = 32)
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
/**
* 签名
* @param $data
* @return string
*/
private static function makeSign($data)
{
$key='91411103ma45wxu12391411103ma45wx';
// 关联排序
ksort($data);
// 字典排序
$str = http_build_query($data);
// 添加商户密钥
$str .= '&key=' . $key;
// 清理空格 非常恶心调了半天
$str = urldecode($str);
$str = md5($str);
// 转换大写
$result = strtoupper($str);
return $result;
}
/**
* 数组转XML
* @param $data
* @return string
*/
private static function arrToXml($data)
{
$xml = "<xml>";
// 遍历组合
foreach ($data as $k=>$v){
$xml.='<'.$k.'>'.$v.'</'.$k.'>';
}
$xml .= '</xml>';
return $xml;
}
/**
* 企业付款发起请求
* 此函数来自:https://pay.weixin.qq.com/wiki/doc/api/download/cert.zip
*/
public static function curl_post_ssl($url, $xmldata, $second=30,$aHeader=array()){
$isdir = $_SERVER['DOCUMENT_ROOT']."/marscert/"; //获取当前项目根目录的路径
$sslcert_path = $isdir.'apiclient_cert.pem'; //pem文件路径,商户号里直接下载
$sslkey_path = $isdir. 'apiclient_key.pem'; //pem文件路径,商户号里直接下载
$ch = curl_init();
//超时时间
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);
//第一种方法,cert 与 key 分别属于两个.pem文件
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT,$sslcert_path);
if( count($aHeader) >= 1 ){
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
}
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xmldata);
$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;
}
}
/***********************企业支付到个人零钱***************************/