1. 程式人生 > >微信公眾號開發---微信企業付款給個人

微信公眾號開發---微信企業付款給個人

   以下有關微信支付中企業付款的介紹及編碼參考自微信支付開發文件,網址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1,如圖所示


     企業付款,提供企業向用戶付款的功能,支援企業通過API介面付款,或通過微信支付商戶平臺網頁功能操作付款。

    企業付款業務是基於微信支付商戶平臺的資金管理能力,為了協助商戶方便地實現企業向個人付款,針對部分有開發能力的商戶,提供通過API完成企業付款的功能。
    比如目前的保險行業向客戶退保、給付、理賠。

   以下是PHP用於實現企業付款業務的程式碼片段,僅供參考。

/*微信企業付款給個人*/
<!--具體細節參考微信支付開發文件-->
<!--引數 $openid個人openid,$re_user_name個人真實姓名,$amount付款金額,$partner_trade_no商戶訂單號,$desc描述-->
<!--返回 如果付款成功,返回true,否則返回false-->
private function weixin_transfer_money($openid,$re_user_name,$amount,$partner_trade_no,$desc){
	//請求引數
	//公眾號appid(欄位名)--mch_appid(變數名)--1(必填)
	//輸入你的公眾號appid
	$data['mch_appid']="**************";  
	
	//商戶號--mchid--1
	//輸入你的商戶號
	$data['mchid']="*************";
	
	//裝置號--device_info--0
	//隨機字串--nonce_str--1
	$data['nonce_str']=$this->get_unique_value();

	//簽名--sign--1
	$data['sign']="";

	//商戶訂單號--partner_trade_no--1
	$data['partner_trade_no']=$partner_trade_no;

	//使用者openid--openid--1
	$data['openid']=$openid;
	
	//校驗使用者姓名選項--check_name--1
	$data['check_name']="OPTION_CHECK";
	
	//收款使用者姓名--re_user_name--0
	$data['re_user_name']=$re_user_name;

	//金額--amount--1
	$data['amount']=$amount;

	//企業付款描述資訊--desc--1
	$data['desc']=$desc;

	//IP地址--spbill_create_ip--1
	$data['spbill_create_ip']=$_SERVER['LOCAL_ADDR'];

	//生成簽名
	//對資料陣列進行處理
	//API金鑰,輸入你的appsecret
	$appsecret="*************";
	$data=array_filter($data);
	ksort($data);
	$str="";
	foreach($data as $k=>$v){
	    $str.=$k."=".$v."&";
	}
	$str.="key=".$appsecret;
	$data['sign']=strtoupper(MD5($str));

	/*
		付款操作:
			1.將請求資料轉換成xml
			2.傳送請求
			3.將請求結果轉換為陣列
			4.將請求資訊和請求結果錄入到資料庫中
			5.判斷是否通訊成功
			6.判斷是否付款成功
	 */



	//企業付款介面地址
	$url="https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";

	//1.將請求資料由陣列轉換成xml
	$xml=$this->arraytoxml($data);
	//2.進行請求操作
	$res=$this->curl($xml,$url);
	//3.將請求結果由xml轉換成陣列
	$arr=$this->xmltoarray($res);

	//4.將請求資訊和請求結果錄入到資料庫中,可以根據自己的需要進行處理,$arr是返回的結果陣列
	$transfer['partner_trade_no']=$data['partner_trade_no'];
	$transfer['request_data']=serialize($data);    
	$transfer['response_data']=serialize($arr);
	if($arr['return_code']=="SUCCESS" && $arr['result_code']=="SUCCESS"){
	    //5. 判斷是否通訊成功 6.判斷是否付款成功
		$transfer['success']=1;
		$transfer_res['success']=1;
	}else{
		$transfer['success']=0;
		$transfer_res['success']=0;
		$transfer_res['desc']=$arr['return_msg'];
	}
	$transfer['add_time']=time();

	D("weixin_transfer")->add($transfer);
    
	return $transfer_res;
}

// 生成32位唯一隨機字串
private function get_unique_value(){
    $str=uniqid(mt_rand(),1);
    $str=sha1($str);
    return md5($str);
}
// 將陣列轉換成xml
private function arraytoxml($arr){
    $xml="<xml>";
    foreach($arr as $k=>$v){
        $xml.="<".$k.">".$v."</".$k.">";
    }
    $xml.="</xml>";
    return $xml;
}
// 將xml轉換成陣列
private function xmltoarray($xml){
    //禁止引用外部xml實體
    libxml_disable_entity_loader(true);
    $xmlstring=simplexml_load_string($xml,"SimpleXMLElement",LIBXML_NOCDATA);
    $arr=json_decode(json_encode($xmlstring),true);
    return $arr;
}

//進行curl操作
private function curl($param="",$url) {
    $postUrl = $url;
    $curlPost = $param;
    //初始化curl
    $ch = curl_init();                                     
    //抓取指定網頁
    curl_setopt($ch, CURLOPT_URL,$postUrl);                 
    //設定header
    curl_setopt($ch, CURLOPT_HEADER, 0);                    
    //要求結果為字串且輸出到螢幕上
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);            
    //post提交方式
    curl_setopt($ch, CURLOPT_POST, 1);                      
    // 增加 HTTP Header(頭)裡的欄位 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);           
    // 終止從服務端進行驗證
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);        
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

    //這個是證書的位置
    curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'\cert\apiclient_cert.pem'); 
    //這個也是證書的位置
    curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'\cert\apiclient_key.pem'); 
    //執行curl
    $data = curl_exec($ch);                                 
    //關閉curl
    curl_close($ch);
    //返回結果
    return $data;
}