/***********************企業支付到個人零錢***************************/
/**
* 企業支付到個人零錢
* @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;
}
}
/***********************企業支付到個人零錢***************************/