1. 程式人生 > >微信支付之公眾號發紅包和企業付款

微信支付之公眾號發紅包和企業付款

微信現金紅包,是微信支付商戶平臺提供的營銷工具之一,上線以來深受廣大商戶與使用者的喜愛。商戶可以通過本平臺向微信支付使用者發放現金紅包。使用者領取紅包後,資金到達使用者微信支付零錢賬戶,在日常運營中為商戶的營銷活動帶來熱烈的反響。

在前幾篇文章中都寫過微信支付與退款,小程式的支付,企業付款等等,今天寫一寫公眾號發紅包的,對於發紅包,需要明白一下幾點:
1.發紅包不需要支付授權目錄,但是需要在商戶後臺呼叫紅包Api的IP地址,也就是你的發起紅包請求的伺服器的IP,操作路徑::【登入商戶平臺——>產品中心——>現金紅包——>產品設定】(注:“產品設定”操作按鈕僅當你開通現金紅包功能之後才會出現)。
2.發紅包需要Api證書。
3.在發放現金紅包之前,請確保你的資金充足。別人通過在你的平臺買東西微信支付付給你的錢和你發紅包需要支出的錢不在一起,這裡的錢需要單獨充值的,操作路徑:【登入商戶平臺——>賬戶中心——>資金管理——>充值】。
4.發紅包可以借權的,比如公眾號A是開通了微信支付的認證服務號,你的活動在公眾號B(訂閱號服務號均可)中舉辦,公眾號B可以使用A的微信支付發紅包,但是發紅包需要知道使用者的openid,獲取這個openid的時候也需要借用公眾號A來獲取,也就是通過A發紅包的這個openid就必須是該使用者對應於A的openid。

操作前期準備,也就是微信支付商戶平臺的一些配置
,請參看文件:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_3&index=2

其實微信公眾號發紅包和微信公眾號企業付款差不多,我也就順帶把企業付款再整理一下,好了話不多說,直接上程式碼:
/**
 * 公眾號發紅包
 * @param string $openid 	使用者openID
 * @param string $money 	金額
 * @param string $trade_no  訂單編號
 * @param string $act_name  活動名稱
 * @return multitype 		支付結果
 */
public function sendredpack($openid,$money,$trade_no,$act_name){
	$config = $this->config;
	
	$data = array(
		'nonce_str' 		=> self::getNonceStr(),
		'mch_billno'     	=> $trade_no,
		'mch_id' 			=> $config['mch_id'],
		'wxappid' 			=> $config['wxappid'],
		'send_name' 		=> '江南極客',
		're_openid'    		=> $openid,
		'total_amount'    	=> $money * 100, //付款金額單位為分
		'total_num'    		=> 1,
		'wishing'      		=> '祝您天天開心!',
		'client_ip' 		=> self::getip(),
		'act_name' 			=> $act_name,
		'remark' 			=> 'From 江南極客'
	);
	
	$data['sign'] = self::makeSign($data);
	
	//構造XML資料
	$xmldata = self::array2xml($data);
	
	$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
	//傳送post請求
	$res = self::curl_post_ssl($url, $xmldata);
	
	if(!$res){
		return array('status'=>0, 'msg'=>"Can't connect the server" );
	}
	
	// 這句file_put_contents是用來檢視伺服器返回的結果 測試完可以刪除了
	//file_put_contents('./log.txt',$res,FILE_APPEND);
	
	$content = self::xml2array($res);
	if(strval($content['return_code']) == 'FAIL'){
		return array('status'=>0, 'msg'=>strval($content['return_msg']));
	}
	if(strval($content['result_code']) == 'FAIL'){
		return array('status'=>0, 'msg'=>strval($content['err_code']).':'.strval($content['err_code_des']));
	}
	return $content;
}
	
/**
 * 公眾號企業支付
 * @param string $openid 	使用者openID
 * @param string $money 	金額
 * @param string $trade_no  訂單編號
 * @param string $desc  	付款操作說明資訊(比如:提現)
 * @return string 	支付結果
 */
public function mchpay($openid,$money,$trade_no,$desc){
	$config = $this->config;
	$data = array(
		'mch_appid' => $config['wxappid'],
		'mchid'     => $config['mch_id'],
		'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' => self::getip()
	);
	
	//生成簽名
	$data['sign'] = self::makeSign($data);
	
	//return $config;
	
	//構造XML資料
	$xmldata = self::array2xml($data);
	$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
	//傳送post請求
	$res = self::curl_post_ssl($url, $xmldata);
	if(!$res){
		return array('status'=>0, 'msg'=>"Can't connect the server" );
	}
	// 這句file_put_contents是用來檢視伺服器返回的結果 測試完可以刪除了
	//file_put_contents('./log1.txt',$res,FILE_APPEND);
	
	//付款結果分析
	$content = self::xml2array($res);
	if(strval($content['return_code']) == 'FAIL'){
		return array('status'=>0, 'msg'=>strval($content['return_msg']));
	}
	if(strval($content['result_code']) == 'FAIL'){
		return array('status'=>0, 'msg'=>strval($content['err_code']).':'.strval($content['err_code_des']));
	}
   
	return $content;
}
這是封裝好的類,呼叫方法也超級簡單:
include 'wxmerpay.class.php';		//引入類檔案
$config = array(
	'wxappid'		=> 'wx123456789',
	'mch_id'	 	=> '1123456781',
	'pay_apikey' 	=> '1234567898765432123456789',
	'api_cert'		=> $cert_path . '/apiclient_cert.pem',	
	'api_key'		=> $cert_path . '/apiclient_key.pem',
	'rootca'		=> $cert_path . '/rootca.pem'
);
$redpack = new WxRedpack($config);	//初始化
$redpack->sendredpack($openid,$money,$trade_no,$act_name);  //發紅包
就這麼簡單嗎?對!就這麼簡單,然而這裡邊使用了很多自己封裝的函式方法,原始碼下載:http://download.csdn.net/download/sinat_35861727/9956485
如果真的感覺好用,請點個贊留個好評,謝謝!有問題也可以評論區告訴我!