微信红包接口
微信红包是微信支付推出的一款基于微信客户端的免费服务应用,微信红包以微信支付
为核心安全保障,为广大用户提供安全,快捷的移劢支付服务。

请求URL
现金红包
https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack

裂变红包
https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack

企业付款
https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers

以现金红包为例:请求参数示例:
<xml>
	<act_name>123123</act_name>
	<client_ip>
		<![CDATA[127.0.0.1]]>
	</client_ip>
	<mch_billno>
		1281216601201609200000000000
	</mch_billno>
	<mch_id>1281216601</mch_id>
	<nonce_str>
		<![CDATA[CgSaD2zSG6ds2r2ulSuSmj3zKUXSukSS]]>
	</nonce_str>
	<re_openid>
		<![CDATA[okzyKwbDW-d7Spc0M112zWZjaa3E]]>
	</re_openid>
	<remark>
		1231
	</remark>
	<send_name>
		<![CDATA[haha哈]]>
	</send_name>
	<total_amount>1.00</total_amount>
	<total_num>1</total_num>
	<wishing>
		<![CDATA[祝您好运]]>
	</wishing>
	<wxappid>
		<![CDATA[wxa316d1ce30f2c952]]>
	</wxappid>
	<sign>
		<![CDATA[52F30DAD7E0ADFA842627179502BC2F3]]>
	</sign>
</xml>

核心代码如下:

$config里面包含了必须的appid,和其他参数,可以看上图详情。只需调用yiy_send(要发送给谁的(openid),金额,配置参数)

/*随机字符串*/
private function random($length, $numeric = FALSE) {
	$seed = base_convert(md5(microtime() . $_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
	$seed = $numeric ? (str_replace('0', '', $seed) . '012340567890') : ($seed . 'zZ' . strtoupper($seed));
	if ($numeric) {
		$hash = '';
	} else {
		$hash = chr(rand(1, 26) + rand(0, 1) * 32 + 64);
		$length--;
	}
	$max = strlen($seed) - 1;
	for ($i = 0; $i < $length; $i++) {
		$hash .= $seed{mt_rand(0, $max)};
	}
	return $hash;
}

//发送红包
private function yiy_send($openid,$price,$config) {
	$uniacid = 2;
	$api = $config['api'];
	$activity = $config['activity'];
	$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
	$pars = array();
	$pars['nonce_str'] = $this->random(32);
	$pars['mch_billno'] = $api['mchid'] . date('YmdHis');
	$pars['mch_id'] = $api['mchid'];
	$pars['wxappid'] = $api['appid'];
	$pars['send_name'] = $activity['provider'];
	$pars['re_openid'] = $openid;
	$pars['total_amount'] = $price*100;
	$pars['total_num'] = 1;
	$pars['wishing'] = $activity['wish'];
	$pars['client_ip'] = $api['ip'];
	$pars['act_name'] = $activity['title'];
	$pars['remark'] = $activity['remark'];

	ksort($pars);
	$string1 = '';
	foreach($pars as $k => $v) {
		$string1 .= "{$k}={$v}&";
	}
	$string1 .= "key={$api['password']}";
	$pars['sign'] = strtoupper(md5($string1));
	$xml = $this->array2xml($pars);
	define(M_PATH, dirname(__FILE__). '/./../../../../addons/ly_huilife/');
	$extras = array();
	//此处为证书位置(绝对路径),改成适合自己的,我这里放的比较那啥。。。。忽略///
	$extras['CURLOPT_CAINFO'] = M_PATH . '/cert/rootca.pem.' . $uniacid;
	$extras['CURLOPT_SSLCERT'] = M_PATH . '/cert/apiclient_cert.pem.' . $uniacid;
	$extras['CURLOPT_SSLKEY'] = M_PATH . '/cert/apiclient_key.pem.' . $uniacid;
	$procResult = null;
	$resp = $this->CurlPostSsl($url, $xml, $extras);
	return $resp;
}

//提交
private function CurlPostSsl($url,$xml,$extras){
	$ch = curl_init();   
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);	
	curl_setopt($ch,CURLOPT_TIMEOUT,60);
	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);
	curl_setopt($ch, CURLOPT_SSLVERSION, 1);
	curl_setopt($ch,CURLOPT_SSLCERT,$extras['CURLOPT_SSLCERT']);    	
	curl_setopt($ch,CURLOPT_SSLKEY,$extras['CURLOPT_SSLKEY']);
	curl_setopt($ch,CURLOPT_CAINFO,$extras['CURLOPT_CAINFO']);
	curl_setopt($ch,CURLOPT_POST, 1);
	curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
	$data = curl_exec($ch);
	var_dump($data);
	if($data){
		curl_close($ch);            
		$rsxml = simplexml_load_string($data);
		if($rsxml->return_code == 'SUCCESS' && $rsxml->result_code == 'SUCCESS'){
			return array('code'=>1,'msg'=>'发放成功');
		}else{
		//这里你可以获取,并返回详细失败信息,我这里都用这种方式返回了。
			return array('code'=>0,'msg'=>'#1未知错误,稍后再试');    
		}
	}else{ 
		$error = curl_errno($ch);
		curl_close($ch);
		return array('code'=>0,'msg'=>$error );
	}
}

function array2xml($arr, $level = 1) {
	$s = $level == 1 ? "<xml>" : '';
	foreach ($arr as $tagname => $value) {
		if (is_numeric($tagname)) {
			$tagname = $value['TagName'];
			unset($value['TagName']);
		}
		if (!is_array($value)) {
			$s .= "<{$tagname}>" . (!is_numeric($value) ? '<![CDATA[' : '') . $value . (!is_numeric($value) ? ']]>' : '') . "</{$tagname}>";
		} else {
			$s .= "<{$tagname}>" . array2xml($value, $level + 1) . "</{$tagname}>";
		}
	}
	$s = preg_replace("/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/", ' ', $s);
	return $level == 1 ? $s . "</xml>" : $s;
}
注意:传入的金额是以分为单位,比如1元,要写成100,不然红包过小会失败的(红包大于等于1元,小于等于200元),比如这样返回:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[每个红包的平均金额必须在1.00元到200.00元之间.]]></return_msg>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[MONEY_LIMIT]]></err_code>
<err_code_des><![CDATA[每个红包的平均金额必须在1.00元到200.00元之间.]]></err_code_des>
<mch_billno><![CDATA[1281216601201609200000000000]]></mch_billno>
<mch_id><![CDATA[1281216601]]></mch_id>
<wxappid><![CDATA[wxa316d1ce30f2c952]]></wxappid>
<re_openid><![CDATA[okzyKwbDW-d7Spc0M112zWZjaa3E]]></re_openid>
<total_amount>1</total_amount>
</xml>
更详细的文档:官方pdf:https://pay.weixin.qq.com/helper/cashredopenapi_V2.pdf
相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!