等了好久,微信支付的企业红包还是没有开放春节期间的裂变红包。
什么是裂变红包?春节抢红包我们会收到“海尔”等企业发送的红包,然后领取完了之后还能转发给好友或者微信群,让朋友一起领取。
有一些第三方开发者试图用H5页面构建裂变红包,集满分享数再调用普通红包发放,很快又被微信严厉禁止。
但是现在企业红包可以有2种发放方式。
1、登陆微信商户平台。https://pay.weixin.qq.com/
充值,创建现金红包,提交openid列表发放。
优点:可以批量发送固定额度,或者随机额度。
缺点:不能程序处理,不够灵活。而且要手动填写openid列表上传。
2、调用红包API发放。
优点:可以程序灵活处理,创建特定场景使用。比如摇周边+抢红包
缺点:只能单个用户发放,接口调用受限制,集中发送接口不稳定。
/**
* 微信企业红包
* @param type $openid 用户openid
* @param type $mch_billno 订单号 $mch_id + 随机数
* @param type $send_name 发送账号昵称
* @param type $total_amount 发送金额
* @param type $wishing 祝福语
* @param type $act_name 活动名称
* @param type $remark 备注
* @return boolean
*/
public function sendredpack($openid, $mch_billno, $send_name, $total_amount, $wishing, $act_name, $remark) {
$postdata = array(
"nonce_str" => $this->generateNonceStr(),
"mch_billno" => $mch_billno,
"mch_id" => $this->partnerid,
"wxappid" => $this->appid,
"nick_name" => $send_name,
"send_name" => $send_name,
"re_openid" => $openid,
"total_amount" => $total_amount,
"min_value" => $total_amount,
"max_value" => $total_amount,
"total_num" => 1,
"wishing" => $wishing,
"client_ip" => get_client_ip(),
"act_name" => $act_name,
"remark" => $remark,
);
$postdata["sign"] = $this->getPaySign($postdata);
$result = $this->curl_post_ssl(self::MCH_REDPACK, self::xml_encode($postdata));
if ($result) {
//$json = json_decode($result, true);
$json = (array) simplexml_load_string($result, 'SimpleXMLElement', LIBXML_NOCDATA);
if (!$json || !empty($json['errcode'])) {
$this->errCode = $json['errcode'];
$this->errMsg = $json['errmsg'] . json_encode($postdata);
return false;
}
return $json;
}
return false;
}
/**
注意:提交的证书地址必须是本地全路径
APP_ROOT . 'Static/Resource/CA/apiclient_key.pem')
**/
function curl_post_ssl($url, $vars, $second = 30, $aHeader = array()) {
$ch = curl_init();
//超时时间
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//这里设置代理,如果有的话
//curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//以下两种方式需选择一种
//第一种方法,cert 与 key 分别属于两个.pem文件
curl_setopt($ch, CURLOPT_SSLCERT, APP_ROOT . 'Static/Resource/CA/apiclient_cert.pem');
curl_setopt($ch, CURLOPT_SSLKEY, APP_ROOT . 'Static/Resource/CA/apiclient_key.pem');
curl_setopt($ch, CURLOPT_CAINFO, APP_ROOT . 'Static/Resource/CA/rootca.pem');
//第二种方式,两个文件合成一个.pem文件
//curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
if (count($aHeader) >= 1) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
}
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
$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;
}
}