微信红包签名错误问题
CLASS WXHongBao {
private $mch_id = "1326840221";//商户ID写死
private $wxappid = "wxc5160f5312b14ce1";//微信公众号,写死
private $client_ip = "114.80.156.254"; //调用红包接口的主机的IP,服务端IP,写死,即脚本文件所在的IP
private $apikey = "CF07A2A4E929D09F7E6B11AEAE902265";//pay的秘钥值
private $total_num = 1;//发放人数。固定值1,不可修改
private $nick_name = "XX公众号"; //红包商户名称
private $send_name = "XX公司";//红包派发者名称
private $wishing = "祝福语"; //
private $act_name = "红包活动"; //活动名称
private $remark = "活动备注";
private $nonce_str = "";
private $mch_billno = "";
private $re_openid = "oicCMwZnp7bcMt8W9gu_ljwfTveY";//接收方的openID
private $total_amount = 1 ;//红包金额,单位 分
private $min_value = 1;//最小金额
private $max_value = 1; //根据接口要求,上述3值必须一致
private $sign = ""; //签名在send时生成
private $amt_type; //分裂红包参数,在sendgroup中进行定义,是常量 ALL_RAND
//证书,在构造函数中定义,注意!
private $apiclient_cert; //= getcwd()."/apiclient_cert.pem";
private $apiclient_key;// = getcwd()."/apiclient_key.pem";
//分享参数
private $isShare = false; //有用?似乎是无用参数,全部都不是必选和互相依赖的参数
private $share_content = "";
private $share_url ="";
private $share_imgurl = "";
private $wxhb_inited;
private $api_hb_group = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack";//裂变红包
private $api_hb_single = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
private $error = "ok"; //init
/**
* WXHongBao::__construct()
* 步骤
* new(openid,amount)
* setnickname
* setsend_name
* setwishing
* setact_name
* setremark
* send()
* @return void
*/
function __construct(){
//好像没有什么需要构造函数做的
$this->wxhb_inited = false;
$this->apiclient_cert = getcwd()."/apiclient_cert.pem";
$this->apiclient_key = getcwd()."/apiclient_key.pem";
}
public function err(){
return $this->error;
}
public function error(){
return $this->err();
}
/**
* WXHongBao::newhb()
* 构造新红包
* @param mixed $toOpenId
* @param mixed $amount 金额分
* @return void
*/
public function newhb($toOpenId,$amount){
if(!is_numeric($amount)){
$this->error = "金额参数错误";
return;
}elseif($amount<100){
$this->error = "金额太小";
return;
}elseif($amount>20000){
$this->error = "金额太大";
return;
}
$this->gen_nonce_str();//构造随机字串
$this->gen_mch_billno();//构造订单号
$this->setOpenId($toOpenId);
$this->setAmount($amount);
$this->wxhb_inited = true; //标记微信红包已经初始化完毕可以发送
//每次new 都要将分享的内容给清空掉,否则会出现残余被引用
$this->share_content= "";
$this->share_imgurl = "";
$this->share_url = "";
}
/**
* WXHongBao::send()
* 发出红包
* 构造签名
* 注意第二参数,单发时不要改动!
* @return boolean $success
*/
public function send($url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack",$total_num = 1){
if(!$this->wxhb_inited){
$this->error .= "(红包未准备好)";
return false; //未初始化完成
}
$this->total_num = $total_num;
$this->gen_Sign(); //生成签名
//构造提交的数据
$xml = $this->genXMLParam();
//debug
file_put_contents("hbxml.debug",$xml);
//提交xml,curl
//$url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
$ch = curl_init();
curl_setopt($ch,CURLOPT_TIMEOUT,10);
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_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT,$this->apiclient_cert);
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY,$this->apiclient_key);
/*
if( count($aHeader) >= 1 ){
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
}
*/
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data = curl_exec($ch);
if($data){
curl_close($ch);
$rsxml = simplexml_load_string($data);
//此处为v2.1主要改动 判断红包发送不但要判断return_code 还要判断 result_code
if($rsxml->return_code == 'SUCCESS' ){ //return_code 反映的是接口响应有没有技术层面的错误,例如参数、签名、服务异常等错误
if($rsxml->result_code == 'SUCCESS'){ //result_code 反映的是业务逻辑上的结果,如账号欠费、下发次数或者金额达到上限等错误
return true;
}else{
$this->error = "(".$rsxml->err_code.")".$rsxml->err_code_des;
return false;
}
}else{
$this->error = $rsxml->return_msg;
return false;
}
}else{
$this->error = curl_errno($ch);
curl_close($ch);
return false;
}
}
/**
* WXHongBao::sendGroup()
* 发送裂变红包,参数为裂变数量
* @param integer $num 3-20
* @return
*/
public function sendGroup($num=3){
$this->amt_type = "ALL_RAND";//$amt; 固定值。发送裂变红包组文档指定参数,随机
return $this->send($this->api_hb_group,$num);
}
public function getApiSingle(){
return $this->api_hb_single;
}
public function getApiGroup(){
return $this->api_hb_group;
}
public function setNickName($nick){
$this->nick_name = $nick;
}
public function setSendName($name){
$this->send_name = $name;
}
public function setWishing($wishing){
$this->wishing = $wishing;
}