溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包

發(fā)布時(shí)間:2021-06-25 13:49:42 來(lái)源:億速云 閱讀:238 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

微信官方說(shuō)明如下

搖一搖紅包說(shuō)明

功能說(shuō)明

搖一搖周邊紅包接口是為線(xiàn)下商戶(hù)提供的發(fā)紅包功能。用戶(hù)可以在商家門(mén)店等線(xiàn)下場(chǎng)所通過(guò)搖一搖周邊領(lǐng)取商家發(fā)放的紅包,在線(xiàn)上轉(zhuǎn)發(fā)分享無(wú)效。

開(kāi)發(fā)者可通過(guò)接口開(kāi)發(fā)搖一搖紅包功能,特點(diǎn)包括:
 1.可選擇使用模板加載頁(yè)或自定義Html5頁(yè)面調(diào)起微信原生紅包頁(yè)面(詳見(jiàn)創(chuàng)建紅包活動(dòng)中use_template字段,1為使用模板,2為使用自定義Html5頁(yè)面)
 2.原生紅包頁(yè)面拆紅包,無(wú)需通過(guò)公眾號(hào)消息下發(fā)
 3.提供關(guān)注公眾號(hào)能力,用戶(hù)可自行選擇是否關(guān)注(裂變紅包分享時(shí)無(wú)效)
 4.完成頁(yè)面可配置跳轉(zhuǎn)鏈接,可跳轉(zhuǎn)商戶(hù)的其他自定義Html5頁(yè)面
 5.同一個(gè)用戶(hù)在單個(gè)紅包活動(dòng)中只能領(lǐng)取1次紅包

用戶(hù)側(cè)交互流程

如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包

紅包組件接口調(diào)用流程

1. 申請(qǐng)紅包接口權(quán)限:登錄搖一搖周邊商戶(hù)后臺(tái)https://zb.weixin.qq.com ,進(jìn)入開(kāi)發(fā)者支持,申請(qǐng)開(kāi)通搖一搖紅包組件接口;
2. 紅包預(yù)下單:調(diào)用微信支付的api進(jìn)行紅包預(yù)下單,告知需要發(fā)放的紅包金額,人數(shù),生成紅包ticket;
3. 創(chuàng)建活動(dòng)并錄入紅包信息:調(diào)用搖周邊平臺(tái)的api錄入創(chuàng)建紅包活動(dòng)并錄入信息,傳入預(yù)下單時(shí)生成的紅包ticket;
4. 調(diào)用jsapi抽紅包:在搖出的頁(yè)面中通過(guò)調(diào)用jsapi抽紅包,抽中紅包的用戶(hù)可以拆紅包;
5. 調(diào)用以上接口時(shí),紅包提供商戶(hù)和紅包發(fā)放商戶(hù)公眾號(hào)要求一致。

 說(shuō)明:

  紅包提供商戶(hù):紅包預(yù)下單接口傳入的參數(shù)wxappid所代表的商戶(hù)
  紅包發(fā)放商戶(hù):調(diào)用紅包接口創(chuàng)建紅包活動(dòng)、錄入紅包信息、發(fā)放紅包的商戶(hù)公眾號(hào)所以步驟應(yīng)該是 ① 創(chuàng)建紅包活動(dòng) ② 預(yù)下單 ③ 錄入紅包找出來(lái)了之前整理的類(lèi) 在寫(xiě)一下1.創(chuàng)建活動(dòng)

接口說(shuō)明

創(chuàng)建紅包活動(dòng),設(shè)置紅包活動(dòng)有效期,紅包活動(dòng)開(kāi)關(guān)等基本信息,返回活動(dòng)id

接口調(diào)用說(shuō)明

 服務(wù)器端調(diào)用

http請(qǐng)求方式: POST
URL: https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=ACCESSTOKEN&use_template=1&logo_url=LOGO_URL

請(qǐng)求參數(shù)說(shuō)明

如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包

請(qǐng)求示例

 Content-Type: application/json Post Body:
{                              
 "title": "title",              
 "desc": "desc",               
 "onoff": 1,                 
 "begin_time": 1428854400,              
 "expire_time": 1428940800,              
 "sponsor_appid": "wxxxxxxxxxxxxxx",
 "total": 10,
 "jump_url": JUMP_URL,   
 "key": "keyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"              
}

返回?cái)?shù)據(jù)說(shuō)明

如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包

示例

 {   
 "errcode":0,   
 "errmsg":"",   
 "lottery_id":"xxxxxxllllll", 
 "page_id":1, 
}
/**
 * 搖一搖紅包 創(chuàng)建活動(dòng)
 * @author jiosen
 */
class addlotteryinfo_pub extends Wxpay_client_pub
{
  var $code;//code碼,用以獲取openid
  var $openid;//用戶(hù)的openid
  function __construct($access_token,$logo)
  {
    //設(shè)置接口鏈接
    $this->url = "https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=".$access_token."&use_template=1&logo_url=".$logo;
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口參數(shù) json
   */
  function createJson()
  {
    try
    {
      //檢測(cè)必填參數(shù)
      if($this->parameters["title"] == null)
      {
        throw new SDKRuntimeException("缺少抽獎(jiǎng)活動(dòng)名稱(chēng)title!"."<br>");
      }elseif ($this->parameters["desc"] == null ) {
        throw new SDKRuntimeException("缺少抽獎(jiǎng)活動(dòng)描述desc!"."<br>");
      }elseif ($this->parameters["begin_time"] == null) {
        throw new SDKRuntimeException("缺少活動(dòng)開(kāi)始時(shí)間 begin_time!"."<br>");
      }elseif ($this->parameters["expire_time"] == null) {
        throw new SDKRuntimeException("缺少活動(dòng)結(jié)束時(shí)間 expire_time!"."<br>");
      }elseif ($this->parameters["total"] == null) {
        throw new SDKRuntimeException("缺少紅包總數(shù)total!"."<br>");
      }elseif ($this->parameters["jump_url"] == null) {
        throw new SDKRuntimeException("缺少紅包關(guān)注跳轉(zhuǎn)連接jump_url!"."<br>");
      }elseif ($this->parameters["key"] == null) {
        throw new SDKRuntimeException("缺少紅包key!"."<br>");
      }
      $this->parameters["title"] = urlencode($this->parameters["title"]);
      $this->parameters["desc"] = urlencode($this->parameters["desc"]);
      $this->parameters["onoff"] = '1';//開(kāi)啟活動(dòng)
      $this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      //var_dump($this->parameters);
      //echo json_encode($this->parameters);
      return json_encode($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function hbpreorder()
  {
    $data = $this->createJson();
    $result = $this->curl_post($this->url,urldecode($data));
    $result = json_decode($result);
    return $result;
  }
  function curl_post($url,$data)
  {
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_POST, 1);//發(fā)送一個(gè)常規(guī)的Post請(qǐng)求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的數(shù)據(jù)包
    $rv = curl_exec($curl);//輸出內(nèi)容
    curl_close($curl);
    return $rv;
  }
  /**
   * 作用:生成可以獲得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth3/authorize?".$bizString;
  }
  /**
   * 作用:生成可以獲得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth3/access_token?".$bizString;
  }
  /**
   * 作用:通過(guò)curl向微信提交code,以獲取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //設(shè)置超時(shí)
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //運(yùn)行curl,結(jié)果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:設(shè)置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}

 要注意提交的數(shù)據(jù)是json 不是xml

前端頁(yè)面隨便做一下

如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包

php 代碼

$title = $_POST['title'];
 $file = $_FILES['img'];
 $tools = new Tools(); //這是一個(gè)文件上傳類(lèi) 隨意選擇一樣你喜歡的上傳方式
 $logo_url = $tools->_upload_award("poll_img", $file, time()); 
 $description = $_POST['description'];
 $total = $_POST['total'];
 $jump_url = $_POST['jump_url'];
 $token = getAccessToken();  //這里是我封裝的一個(gè)獲取 token的 方法 做了時(shí)間限制 防止超出調(diào)用次數(shù)
   $Redpack = new addlotteryinfo_pub($token,SITE_URL.$logo_url);
   $time = time();
   $end = time()+60*24*60*60;//兩個(gè)月 這里的開(kāi)始和結(jié)束時(shí)間我固定了 
  $key = $Redpack->createNoncestr(); //key
 $Redpack->setParameter('title', $title);
//活動(dòng)標(biāo)題
$Redpack->setParameter('desc', $description);
//活動(dòng)描述
$Redpack->setParameter('begin_time', $time);
//開(kāi)始時(shí)間
$Redpack->setParameter('expire_time', $end); 
//結(jié)束時(shí)間
$Redpack->setParameter('total', $total);
//紅包總數(shù)
$Redpack->setParameter('jump_url', $jump_url);
//key
$Redpack->setParameter('key', $key);
$result = $Redpack->hbpreorder();
$result = (array)$result; 
if($result['errcode']==0){
   $lottery_id = $result['lottery_id'];
  $page_id = $result['page_id'];
  //這里記得存一下數(shù)據(jù)庫(kù);           
}else{
  //echo '創(chuàng)建活動(dòng)失?。?#39;.$result['errmsg'];
  //這里是錯(cuò)誤提示
}

 2.預(yù)下單

接口說(shuō)明

設(shè)置單個(gè)紅包的金額,類(lèi)型等,生成紅包信息。預(yù)下單完成后,需要在72小時(shí)內(nèi)調(diào)用jsapi完成抽紅包的操作。(紅包過(guò)期失效后,資金會(huì)退回到商戶(hù)財(cái)付通帳號(hào)。)

接口調(diào)用說(shuō)明

服務(wù)器端調(diào)用

http請(qǐng)求方式: POST

https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder

POST數(shù)據(jù)格式:XML

需要商戶(hù)證書(shū)

請(qǐng)求參數(shù)說(shuō)明

如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包

如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包

請(qǐng)求示例

<xml>   
<sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>   
<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>   
<mch_id><![CDATA[10000097]]></mch_id>   
<wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>   
<send_name><![CDATA[send_name]]></send_name>   
<hb_type><![CDATA[NORMAL]]></hb_type>   
<auth_mchid><![CDATA[10000098]]></auth_mchid>   
<auth_appid><![CDATA[wx7777777]]></auth_appid>   
<total_amount><![CDATA[200]]></total_amount>   
<amt_type><![CDATA[ALL_RAND]]></amt_type>   
<total_num><![CDATA[3]]></total_num>   
<wishing><![CDATA[恭喜發(fā)財(cái) ]]></wishing>   
<act_name><![CDATA[ 新年紅包 ]]></act_name>   
<remark><![CDATA[新年紅包 ]]></remark>   
<risk_cntl><![CDATA[NORMAL]]></risk_cntl>   
<nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str>
</xml>

返回?cái)?shù)據(jù)說(shuō)明

如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包

以下字段在return_code 和result_code都為SUCCESS的時(shí)候有返回

如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包

成功示例

 <xml> 
<return_code><![CDATA[SUCCESS]]></return_code> 
<return_msg><![CDATA[發(fā)放成功.]]></return_msg> 
<result_code><![CDATA[SUCCESS]]></result_code> 
<err_code><![CDATA[0]]></err_code> 
<err_code_des><![CDATA[發(fā)放成功.]]></err_code_des> 
<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno> 
<mch_id>10010404</mch_id> 
<wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid> 
<sp_ticket><![CDATA[0cca98c8c8e814883]]></sp_ticket> 
<total_amount>3</total_amount> 
<detail_id><![CDATA[001001040420141117000004888]]></detail_id> 
<send_time><![CDATA[20150101080000]]></send_time> 
</xml>

失敗示例

 <xml>   
<return_code><![CDATA[FAIL]]></return_code> 
<return_msg><![CDATA[系統(tǒng)繁忙,請(qǐng)稍后再試.]]></return_msg> 
<result_code><![CDATA[FAIL]]></result_code> 
<err_code><![CDATA[268458547]]></err_code> 
<err_code_des><![CDATA[系統(tǒng)繁忙,請(qǐng)稍后再試.]]></err_code_des> 
<mch_billno><![CDATA[0010010404201411170000046542]]></mch_billno>     
<mch_id>10010404</mch_id> 
<wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>  
<total_amount>3</total_amount> 
</xml> 
/**
 * 搖一搖紅包預(yù)下單 
 * @author jiosen
 */
class Yhb_pub extends Wxpay_client_pub
{
  var $code;//code碼,用以獲取openid
  var $openid;//用戶(hù)的openid
  function __construct()
  {
    //設(shè)置接口鏈接
    $this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder";
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口參數(shù)xml
   */
  function createXml()
  {
    try
    {
      //檢測(cè)必填參數(shù)
      if($this->parameters["mch_billno"] == null)
      {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)mch_billno!"."<br>");
      }elseif ($this->parameters["send_name"] == null ) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)send_name!"."<br>");
      }elseif ($this->parameters["total_amount"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)total_amount!"."<br>");
      }elseif ($this->parameters["total_num"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)total_num!"."<br>");
      }elseif ($this->parameters["wishing"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)wishing!"."<br>");
      }elseif ($this->parameters["act_name"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)act_name!"."<br>");
      }elseif ($this->parameters["remark"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)remark!"."<br>");
      }
      $this->parameters["wxappid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
      $this->parameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
      //$this->parameters["re_openid"] = $this->openid;//用戶(hù)openid
      $this->parameters["hb_type"] = 'NORMAL';//紅包類(lèi)型 NORMAL-普通紅包;GROUP-裂變紅包(可分享紅包給好友,無(wú)關(guān)注公眾號(hào)能力)。 
      $this->parameters["auth_mchid"] = '1000052601';//搖周邊商戶(hù)號(hào)
      $this->parameters["auth_appid"] = 'wxbf42bd79c4391863';//搖周邊 appid
      $this->parameters["risk_cntl"] = 'NORMAL';//風(fēng)控設(shè)置
      $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function hbpreorder()
  {
    $this->postXmlSSL();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
  /**
   * 作用:生成可以獲得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth3/authorize?".$bizString;
  }
  /**
   * 作用:生成可以獲得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth3/access_token?".$bizString;
  }
  /**
   * 作用:通過(guò)curl向微信提交code,以獲取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //設(shè)置超時(shí)
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //運(yùn)行curl,結(jié)果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:設(shè)置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}

 這里需要注意的是  auth_mchid 和 auth_appid 要填搖周邊平臺(tái)給出的appid 和商戶(hù)號(hào)
 調(diào)用 (這里不貼前端頁(yè)面了)

$Redpack = new \Yhb_pub(); 
 $Redpack->setParameter('mch_billno', WxPayConf_pub::MCHID.date('YmdHis').rand(1000, 9999));
 //商戶(hù)名稱(chēng)
 $Redpack->setParameter('send_name', "商戶(hù)名稱(chēng)");
 //付款金額
 $Redpack->setParameter('total_amount', 100); //單位分
 //紅包發(fā)放總?cè)藬?shù)
 $Redpack->setParameter('amt_type', "ALL_RAND");
 $Redpack->setParameter('total_num', 1);
 //紅包祝福語(yǔ)
 $Redpack->setParameter('wishing', "搖一搖送紅包");
 //活動(dòng)名稱(chēng)
 $Redpack->setParameter('act_name', "搖一搖送紅包");
 //備注
 $Redpack->setParameter('remark', "搖一搖送紅包 備注");
 $result = $Redpack->hbpreorder();
 if($result[''])

 3.錄入紅包

接口說(shuō)明

在調(diào)用"創(chuàng)建紅包活動(dòng)"接口之后,調(diào)用此接口錄入紅包信息。注意,此接口每次調(diào)用,都會(huì)向某個(gè)活動(dòng)新增一批紅包信息,如果紅包數(shù)少于100 個(gè),請(qǐng)通過(guò)一次調(diào)用添加所有紅包信息。如果紅包數(shù)大于100,可以多次調(diào)用接口添加。請(qǐng)注意確保多次錄入的紅包ticket總的數(shù)目不大于創(chuàng)建該紅包活動(dòng) 時(shí)設(shè)置的total值。

接口調(diào)用說(shuō)明

 服務(wù)器端調(diào)用

http請(qǐng)求方式: POST
URL:https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=ACCESSTOKEN

請(qǐng)求參數(shù)說(shuō)明

如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包

POST BODY:JSON格式的結(jié)構(gòu)體

請(qǐng)求示例

 Content-Type: application/json Post Body:
{   
"lottery_id": "xxxxxxllllll",   
"mchid": "10000098",   
"sponsor_appid": "wx8888888888888888",  
"prize_info_list": [     
   {      
  "ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g=="
   },
   {
  "ticket": "v1|fOhNUTap1oepSm5ap0hx1gmATM\/QX\/xn3sZWL7K+5Z10sbV5\/mZ4SwxwxbK2SPV32eLRvjd4ww1G3H5a+ypqRrySi+4oo97y63KoEQbRCPjbkyQBY8AYVyvD40V2b9slTQCm2igGY98mPe+VxZiayQ=="
   }
  ]
}

返回?cái)?shù)據(jù)說(shuō)明

如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包

示例

 {   
"errcode":0,   
"errmsg":"",   
"repeat_ticket_list":[     
   {      
"ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g=="            
   },
   {
"ticket":"v1|ZiPs2l0zzXCsdfwe45dxCdHiukOdz/V/zQ/89xcnC5XnT+e47/q1FJjwCO4frSjzOxAEzJ7k2CtAg1pmcShvkChBWzc45dDGC32Dcxx4DGxczjDCGsdjowe9iHuaEn0WAO+GswFOlDYWg1ngvrRYnCY3g=="     }   
   } 
 ], 
"success_num":100 
}

/**
 * 搖一搖紅包 錄入紅包
 * @author jiosen
 */
class lottery_pub extends Wxpay_client_pub
{
  var $code;//code碼,用以獲取openid
  var $openid;//用戶(hù)的openid
  function __construct($access_token)
  {
    //設(shè)置接口鏈接
    $this->url = "https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=".$access_token;
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口參數(shù) json
   */
  function createJson()
  {
    try
    {
      //檢測(cè)必填參數(shù)
      if($this->parameters["lottery_id"] == null)
      {
        throw new SDKRuntimeException("缺少抽獎(jiǎng)活動(dòng)id lottery_id !"."<br>");
      }else if(empty($this->parameters["prize_info_list"])){
        throw new SDKRuntimeException("缺少抽獎(jiǎng)活動(dòng)紅包 prize_info_list !"."<br>");
      }
      $this->parameters["mchid"] = WxPayConf_pub::MCHID;//授權(quán)商戶(hù)號(hào)
      $this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//授權(quán)上號(hào)appid
      return json_encode($this->parameters);
      //echo json_encode($this->parameters);die;
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function setJsonArray($parameter, $parameterValue){
    $this->parameters[$this->trimString($parameter)] = $parameterValue;
  }
  function hbpreorder()
  {
    $data = $this->createJson();
    $result = $this->curl_post($this->url,$data);
    $result = json_decode($result);
    return $result;
  }
  function curl_post($url,$data)
  {
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_POST, 1);//發(fā)送一個(gè)常規(guī)的Post請(qǐng)求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的數(shù)據(jù)包
    $rv = curl_exec($curl);//輸出內(nèi)容
    curl_close($curl);
    return $rv;
  }
  /**
   * 作用:生成可以獲得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth3/authorize?".$bizString;
  }
  /**
   * 作用:生成可以獲得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth3/access_token?".$bizString;
  }
  /**
   * 作用:通過(guò)curl向微信提交code,以獲取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //設(shè)置超時(shí)
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //運(yùn)行curl,結(jié)果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:設(shè)置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}

 調(diào)用

<br>    $token = getAccessToken();<br>    $Redpack = new \lottery_pub($token);<br>    $lottery_id = ''; //這里讀取數(shù)據(jù)庫(kù)取出創(chuàng)建活動(dòng)時(shí)返回的 lottery_id
 $Redpack->setParameter('lottery_id', $lottery_id);
  //活動(dòng)id
  $prize_info_list =array(array('ticket'=>'這里取出預(yù)下單返回的sp_ticket'));
  $Redpack->setJsonArray('prize_info_list', $prize_info_list);
  //提交
  $Redpack->hbpreorder();

搶紅包頁(yè)面  php

function getshakeinfo($access_token,$ticket){
    $getshakeinfourl='https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token='.$access_token;
     $jo=0;
     if($access_token){
      $data=array('ticket' =>$ticket);
      $rd=$this->curl_post($getshakeinfourl,json_encode($data));
      $jo=json_decode($rd);
     }else{
      echo 'access_token null';
     }
     return $jo;
  }
    $ticket=$_GET['ticket'];//獲叏設(shè)備信息,包括 U UID 、 major 、 minor ,以及距離、 openID 等信息
    $token = getAccessToken();
    $shake=getshakeinfo($token,$ticket);
    $openid=$shake->data->openid;
    $jsapi = new Common_util_pub(); 
    $noncestr = $jsapi->createNoncestr();
    $parameters = array(
        'lottery_id' =>'創(chuàng)建活動(dòng)時(shí)候返回的活動(dòng)ID',
        'noncestr'=>$noncestr,
        'openid'=>$openid,
      );
    $signStr = $jsapi->formatBizQueryParaMap($parameters,false);
    $key = '創(chuàng)建活動(dòng)時(shí)候的key';
    $signStr=$signStr."&key=".$key;
    $sign = strtoupper(md5($signStr));

 上一步返回的參數(shù)填在搶紅包html頁(yè)面

<script type="text/javascript" src="http://zb.weixin.qq.com/app/shakehb/BeaconShakehbJsBridge.js">
</script>
<script type="text/javascript">
  BeaconShakehbJsBridge.ready(function(){
    //alert();
    BeaconShakehbJsBridge.invoke('jumpHongbao',{lottery_id:"{$lottery_id}",noncestr:"{$noncestr}",openid:"{$openid}",sign:"{$sign}"}); 
    });
</script>

紅包綁定用戶(hù)事件通知     

接口說(shuō)明

用戶(hù)進(jìn)入紅包頁(yè)面時(shí),后臺(tái)會(huì)將一個(gè)紅包ticket和用戶(hù)openid綁定,微信會(huì)把這個(gè)事件推送到開(kāi)發(fā)者填寫(xiě)的URL(登錄公眾平臺(tái)進(jìn)入開(kāi)發(fā)者中心設(shè)置)。推送內(nèi)容包含用戶(hù)openid,紅包活動(dòng)id,紅包ticket、金額以及紅包綁定時(shí)間。
 注:紅包綁定用戶(hù)不等同于用戶(hù)領(lǐng)取紅包。用戶(hù)進(jìn)入紅包頁(yè)面后,有可能不拆紅包,但該紅包ticket已被綁定,不能再被其他用戶(hù)綁定,過(guò)期后會(huì)退回商戶(hù)財(cái)付通賬戶(hù)。

推送XML數(shù)據(jù)包示例

<xml> 
<ToUserName><![CDATA[toUser]]></ToUserName> 
<FromUserName><![CDATA[fromUser]]></FromUserName> 
<CreateTime>1442824314</CreateTime> 
<MsgType><![CDATA[event]]></MsgType> 
<Event><![CDATA[ShakearoundLotteryBind]]></Event> 
<LotteryId><![CDATA[lotteryid]]></LotteryId> 
<Ticket><![CDATA[ticket]]></Ticket> 
<Money>88</Money> 
<BindTime>1442824313</BindTime> 
</xml>

 添加事件處理即可

/**
   * 事件處理
   * @param unknown $object
   * @return string
   */
  public function handleEvent($object) {
    // Event是事件類(lèi)型(subscribe,LOCATION)
    $oneEvent = $object->Event;
    // EventKey是菜單事件的key值
    $key = $object->EventKey;
    // 關(guān)注事件
    if ($oneEvent == "subscribe" || $oneEvent == "SCAN") {
      if(!empty($object->Ticket)) {
        //掃碼事件
        ....
      } else {
        //關(guān)注事件
        ....
      }
    }else if($oneEvent=="ShakearoundLotteryBind"){
      //添加到數(shù)據(jù)庫(kù)
    }else if.......其他的事件......
  }

 完畢了.時(shí)間比較匆忙 也沒(méi)時(shí)間做優(yōu)化 大神經(jīng)過(guò)順便指導(dǎo)12  我好搓的英文基礎(chǔ)

下面貼上完整WxPayPubHelper 集成了所有支付類(lèi) 配置可用

<?php
/**
 * 微信支付幫助庫(kù)
 * ====================================================
 * 接口分三種類(lèi)型:
 * 【請(qǐng)求型接口】--Wxpay_client_
 *   統(tǒng)一支付接口類(lèi)--UnifiedOrder
 *   訂單查詢(xún)接口--OrderQuery
 *   退款申請(qǐng)接口--Refund
 *   退款查詢(xún)接口--RefundQuery
 *   對(duì)賬單接口--DownloadBill
 *   短鏈接轉(zhuǎn)換接口--ShortUrl
 * 【響應(yīng)型接口】--Wxpay_server_
 *   通用通知接口--Notify
 *   Native支付——請(qǐng)求商家獲取商品信息接口--NativeCall
 * 【其他】
 *   靜態(tài)鏈接二維碼--NativeLink
 *   JSAPI支付--JsApi
 * =====================================================
 * 【CommonUtil】常用工具:
 *   trimString(),設(shè)置參數(shù)時(shí)需要用到的字符處理函數(shù)
 *   createNoncestr(),產(chǎn)生隨機(jī)字符串,不長(zhǎng)于32位
 *   formatBizQueryParaMap(),格式化參數(shù),簽名過(guò)程需要用到
 *   getSign(),生成簽名
 *   arrayToXml(),array轉(zhuǎn)xml
 *   xmlToArray(),xml轉(zhuǎn) array
 *   postXmlCurl(),以post方式提交xml到對(duì)應(yīng)的接口url
 *   postXmlSSLCurl(),使用證書(shū),以post方式提交xml到對(duì)應(yīng)的接口url
*/
  include_once("SDKRuntimeException.php");
  include_once("WxPay.pub.config.php");
/**
 * 所有接口的基類(lèi)
 */
class Common_util_pub
{
  function __construct() {
  }
  function trimString($value)
  {
    $ret = null;
    if (null != $value) 
    {
      $ret = $value;
      if (strlen($ret) == 0) 
      {
        $ret = null;
      }
    }
    return $ret;
  }
  /**
   * 作用:產(chǎn)生隨機(jī)字符串,不長(zhǎng)于32位
   */
  public function createNoncestr( $length = 32 ) 
  {
    $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; 
    $str ="";
    for ( $i = 0; $i < $length; $i++ ) { 
      $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1); 
    } 
    return $str;
  }
  /**
   * 作用:格式化參數(shù),簽名過(guò)程需要使用
   */
  function formatBizQueryParaMap($paraMap, $urlencode)
  {
    $buff = "";
    ksort($paraMap);
    foreach ($paraMap as $k => $v)
    {
      if($urlencode)
      {
        $v = urlencode($v);
      }
      //$buff .= strtolower($k) . "=" . $v . "&";
      $buff .= $k . "=" . $v . "&";
    }
    $reqPar;
    if (strlen($buff) > 0) 
    {
      $reqPar = substr($buff, 0, strlen($buff)-1);
    }
    return $reqPar;
  }
  /**
   * 作用:生成簽名
   */
  public function getSign($Obj)
  {
    foreach ($Obj as $k => $v)
    {
      $Parameters[$k] = $v;
    }
    //簽名步驟一:按字典序排序參數(shù)
    ksort($Parameters);
    $String = $this->formatBizQueryParaMap($Parameters, false);
    //echo '【string1】'.$String.'</br>';
    //簽名步驟二:在string后加入KEY
    $String = $String."&key=".WxPayConf_pub::KEY;
    //echo "【string2】".$String."</br>";
    //簽名步驟三:MD5加密
    $String = md5($String);
    //echo "【string3】 ".$String."</br>";
    //簽名步驟四:所有字符轉(zhuǎn)為大寫(xiě)
    $result_ = strtoupper($String);
    //echo "【result】 ".$result_."</br>";
    return $result_;
  }
  /**
   * 作用:array轉(zhuǎn)xml
   */
  function arrayToXml($arr)
  {
    $xml = "<xml>";
    foreach ($arr as $key=>$val)
    {
       if (is_numeric($val))
       {
        $xml.="<".$key.">".$val."</".$key.">"; 
       }
       else
        $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; 
    }
    $xml.="</xml>";
    return $xml; 
  }
  /**
   * 作用:將xml轉(zhuǎn)為array
   */
  public function xmlToArray($xml)
  {    
    //將XML轉(zhuǎn)為array    
    $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);   
    return $array_data;
  }
  /**
   * 作用:以post方式提交xml到對(duì)應(yīng)的接口url
   */
  public function postXmlCurl($xml,$url,$second=30)
  {    
    //初始化curl    
    $ch = curl_init();
    //設(shè)置超時(shí)
    curl_setopt($ch, CURLOP_TIMEOUT, $second);
    //這里設(shè)置代理,如果有的話(huà)
    //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
    //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);
    //設(shè)置header
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    //要求結(jié)果為字符串且輸出到屏幕上
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //post提交方式
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    //運(yùn)行curl
    $data = curl_exec($ch);
    curl_close($ch);
    //返回結(jié)果
    if($data)
    {
      curl_close($ch);
      return $data;
    }
    else
    { 
      $error = curl_errno($ch);
      echo "curl出錯(cuò),錯(cuò)誤碼:$error"."<br>"; 
      echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>錯(cuò)誤原因查詢(xún)</a></br>";
      curl_close($ch);
      return false;
    }
  }
  /**
   * 作用:使用證書(shū),以post方式提交xml到對(duì)應(yīng)的接口url
   */
  function postXmlSSLCurl($xml,$url,$second=30)
  {
    $ch = curl_init();
    //超時(shí)時(shí)間
    curl_setopt($ch,CURLOPT_TIMEOUT,$second);
    //這里設(shè)置代理,如果有的話(huà)
    //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
    //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);
    //設(shè)置header
    curl_setopt($ch,CURLOPT_HEADER,FALSE);
    //要求結(jié)果為字符串且輸出到屏幕上
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
    //設(shè)置證書(shū)
    //使用證書(shū):cert 與 key 分別屬于兩個(gè).pem文件
    //默認(rèn)格式為PEM,可以注釋
//   curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
//   curl_setopt($ch,CURLOPT_SSLCERT,WxPayConf_pub::SSLCERT_PATH );
//   //默認(rèn)格式為PEM,可以注釋
//   curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
//   curl_setopt($ch,CURLOPT_SSLKEY, WxPayConf_pub::SSLKEY_PATH);
    curl_setopt($ch, CURLOPT_SSLCERT,WxPayConf_pub::SSLCERT_PATH);
    curl_setopt($ch, CURLOPT_SSLKEY,WxPayConf_pub::SSLKEY_PATH);
    curl_setopt($ch, CURLOPT_CAINFO, WxPayConf_pub::SSLCA_PATH); // CA根證書(shū)(用來(lái)驗(yàn)證的網(wǎng)站證書(shū)是否是CA頒布)
    //post提交方式
    curl_setopt($ch,CURLOPT_POST, true);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
    $data = curl_exec($ch);
    //返回結(jié)果
    if($data){
      curl_close($ch);
      return $data;
    }
    else { 
      $error = curl_errno($ch);
      echo "curl出錯(cuò),錯(cuò)誤碼:$error"."<br>"; 
      echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>錯(cuò)誤原因查詢(xún)</a></br>";
      curl_close($ch);
      return false;
    }
  }
  /**
   * 作用:打印數(shù)組
   */
  function printErr($wording='',$err='')
  {
    print_r('<pre>');
    echo $wording."</br>";
    var_dump($err);
    print_r('</pre>');
  }
}
/**
 * 請(qǐng)求型接口的基類(lèi)
 */
class Wxpay_client_pub extends Common_util_pub 
{
  var $parameters;//請(qǐng)求參數(shù),類(lèi)型為關(guān)聯(lián)數(shù)組
  public $response;//微信返回的響應(yīng)
  public $result;//返回參數(shù),類(lèi)型為關(guān)聯(lián)數(shù)組
  var $url;//接口鏈接
  var $curl_timeout;//curl超時(shí)時(shí)間
  /**
   * 作用:設(shè)置請(qǐng)求參數(shù)
   */
  function setParameter($parameter, $parameterValue)
  {
    $this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
  }
  /**
   * 作用:設(shè)置標(biāo)配的請(qǐng)求參數(shù),生成簽名,生成接口參數(shù)xml
   */
  function createXml()
  {
    $this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
    $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
    $this->parameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
    $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
    return $this->arrayToXml($this->parameters);
  }
  /**
   * 作用:post請(qǐng)求xml
   */
  function postXml()
  {
    $xml = $this->createXml();
    $this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);
    return $this->response;
  }
  /**
   * 作用:使用證書(shū)post請(qǐng)求xml
   */
  function postXmlSSL()
  {  
    $xml = $this->createXml();
    $this->response = $this->postXmlSSLCurl($xml,$this->url,$this->curl_timeout);
    return $this->response;
  }
  /**
   * 作用:獲取結(jié)果,默認(rèn)不使用證書(shū)
   */
  function getResult() 
  {    
    $this->postXml();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
}
/**
 * 統(tǒng)一支付接口類(lèi)
 */
class UnifiedOrder_pub extends Wxpay_client_pub
{  
  function __construct() 
  {
    //設(shè)置接口鏈接
    $this->url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口參數(shù)xml
   */
  function createXml()
  {
    try
    {
      //檢測(cè)必填參數(shù)
      if($this->parameters["out_trade_no"] == null) 
      {
        throw new SDKRuntimeException("缺少統(tǒng)一支付接口必填參數(shù)out_trade_no!"."<br>");
      }elseif($this->parameters["body"] == null){
        throw new SDKRuntimeException("缺少統(tǒng)一支付接口必填參數(shù)body!"."<br>");
      }elseif ($this->parameters["total_fee"] == null ) {
        throw new SDKRuntimeException("缺少統(tǒng)一支付接口必填參數(shù)total_fee!"."<br>");
      }elseif ($this->parameters["notify_url"] == null) {
        throw new SDKRuntimeException("缺少統(tǒng)一支付接口必填參數(shù)notify_url!"."<br>");
      }elseif ($this->parameters["trade_type"] == null) {
        throw new SDKRuntimeException("缺少統(tǒng)一支付接口必填參數(shù)trade_type!"."<br>");
      }elseif ($this->parameters["trade_type"] == "JSAPI" &&
        $this->parameters["openid"] == NULL){
        throw new SDKRuntimeException("統(tǒng)一支付接口中,缺少必填參數(shù)openid!trade_type為JSAPI時(shí),openid為必填參數(shù)!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
      $this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//終端ip    
      $this->parameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  /**
   * 獲取prepay_id
   */
  function getPrepayId()
  {
    $this->postXml();
    $this->result = $this->xmlToArray($this->response);
    $prepay_id = $this->result["prepay_id"];
    return $prepay_id;
  }
}
/**
 * 訂單查詢(xún)接口
 */
class OrderQuery_pub extends Wxpay_client_pub
{
  function __construct() 
  {
    //設(shè)置接口鏈接
    $this->url = "https://api.mch.weixin.qq.com/pay/orderquery";
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;    
  }
  /**
   * 生成接口參數(shù)xml
   */
  function createXml()
  {
    try
    {
      //檢測(cè)必填參數(shù)
      if($this->parameters["out_trade_no"] == null && 
        $this->parameters["transaction_id"] == null) 
      {
        throw new SDKRuntimeException("訂單查詢(xún)接口中,out_trade_no、transaction_id至少填一個(gè)!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
      $this->parameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
}
/**
 * 退款申請(qǐng)接口
 */
class Refund_pub extends Wxpay_client_pub
{
  function __construct() {
    //設(shè)置接口鏈接
    $this->url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;    
  }
  /**
   * 生成接口參數(shù)xml
   */
  function createXml()
  {
    try
    {
      //檢測(cè)必填參數(shù)
      if($this->parameters["out_trade_no"] == null && $this->parameters["transaction_id"] == null) {
        throw new SDKRuntimeException("退款申請(qǐng)接口中,out_trade_no、transaction_id至少填一個(gè)!"."<br>");
      }elseif($this->parameters["out_refund_no"] == null){
        throw new SDKRuntimeException("退款申請(qǐng)接口中,缺少必填參數(shù)out_refund_no!"."<br>");
      }elseif($this->parameters["total_fee"] == null){
        throw new SDKRuntimeException("退款申請(qǐng)接口中,缺少必填參數(shù)total_fee!"."<br>");
      }elseif($this->parameters["refund_fee"] == null){
        throw new SDKRuntimeException("退款申請(qǐng)接口中,缺少必填參數(shù)refund_fee!"."<br>");
      }elseif($this->parameters["op_user_id"] == null){
        throw new SDKRuntimeException("退款申請(qǐng)接口中,缺少必填參數(shù)op_user_id!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
      $this->parameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  /**
   * 作用:獲取結(jié)果,使用證書(shū)通信
   */
  function getResult() 
  {    
    $this->postXmlSSL();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
}
/**
 * 退款查詢(xún)接口
 */
class RefundQuery_pub extends Wxpay_client_pub
{
  function __construct() {
    //設(shè)置接口鏈接
    $this->url = "https://api.mch.weixin.qq.com/pay/refundquery";
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;    
  }
  /**
   * 生成接口參數(shù)xml
   */
  function createXml()
  {    
    try
    {
      if($this->parameters["out_refund_no"] == null &&
        $this->parameters["out_trade_no"] == null &&
        $this->parameters["transaction_id"] == null &&
        $this->parameters["refund_id "] == null) 
      {
        throw new SDKRuntimeException("退款查詢(xún)接口中,out_refund_no、out_trade_no、transaction_id、refund_id四個(gè)參數(shù)必填一個(gè)!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
      $this->parameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  /**
   * 作用:獲取結(jié)果,使用證書(shū)通信
   */
  function getResult() 
  {    
    $this->postXmlSSL();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
}
/**
 * 對(duì)賬單接口
 */
class DownloadBill_pub extends Wxpay_client_pub
{
  function __construct() 
  {
    //設(shè)置接口鏈接
    $this->url = "https://api.mch.weixin.qq.com/pay/downloadbill";
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;    
  }
  /**
   * 生成接口參數(shù)xml
   */
  function createXml()
  {    
    try
    {
      if($this->parameters["bill_date"] == null ) 
      {
        throw new SDKRuntimeException("對(duì)賬單接口中,缺少必填參數(shù)bill_date!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
      $this->parameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  /**
   * 作用:獲取結(jié)果,默認(rèn)不使用證書(shū)
   */
  function getResult() 
  {    
    $this->postXml();
    $this->result = $this->xmlToArray($this->result_xml);
    return $this->result;
  }
}
/**
 * 短鏈接轉(zhuǎn)換接口
 */
class ShortUrl_pub extends Wxpay_client_pub
{
  function __construct() 
  {
    //設(shè)置接口鏈接
    $this->url = "https://api.mch.weixin.qq.com/tools/shorturl";
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;    
  }
  /**
   * 生成接口參數(shù)xml
   */
  function createXml()
  {    
    try
    {
      if($this->parameters["long_url"] == null ) 
      {
        throw new SDKRuntimeException("短鏈接轉(zhuǎn)換接口中,缺少必填參數(shù)long_url!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
      $this->parameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  /**
   * 獲取prepay_id
   */
  function getShortUrl()
  {
    $this->postXml();
    $prepay_id = $this->result["short_url"];
    return $prepay_id;
  }
}
/**
 * 響應(yīng)型接口基類(lèi)
 */
class Wxpay_server_pub extends Common_util_pub 
{
  public $data;//接收到的數(shù)據(jù),類(lèi)型為關(guān)聯(lián)數(shù)組
  var $returnParameters;//返回參數(shù),類(lèi)型為關(guān)聯(lián)數(shù)組
  /**
   * 將微信的請(qǐng)求xml轉(zhuǎn)換成關(guān)聯(lián)數(shù)組,以方便數(shù)據(jù)處理
   */
  function saveData($xml)
  {
    $this->data = $this->xmlToArray($xml);
  }
  function checkSign()
  {
    $tmpData = $this->data;
    unset($tmpData['sign']);
    $sign = $this->getSign($tmpData);//本地簽名
    if ($this->data['sign'] == $sign) {
      return TRUE;
    }
    return FALSE;
  }
  /**
   * 獲取微信的請(qǐng)求數(shù)據(jù)
   */
  function getData()
  {    
    return $this->data;
  }
  /**
   * 設(shè)置返回微信的xml數(shù)據(jù)
   */
  function setReturnParameter($parameter, $parameterValue)
  {
    $this->returnParameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
  }
  /**
   * 生成接口參數(shù)xml
   */
  function createXml()
  {
    return $this->arrayToXml($this->returnParameters);
  }
  /**
   * 將xml數(shù)據(jù)返回微信
   */
  function returnXml()
  {
    $returnXml = $this->createXml();
    return $returnXml;
  }
}
/**
 * 通用通知接口
 */
class Notify_pub extends Wxpay_server_pub 
{
}
/**
 * 請(qǐng)求商家獲取商品信息接口
 */
class NativeCall_pub extends Wxpay_server_pub
{
  /**
   * 生成接口參數(shù)xml
   */
  function createXml()
  {
    if($this->returnParameters["return_code"] == "SUCCESS"){
      $this->returnParameters["appid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      $this->returnParameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
      $this->returnParameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
      $this->returnParameters["sign"] = $this->getSign($this->returnParameters);//簽名
    }
    return $this->arrayToXml($this->returnParameters);
  }
  /**
   * 獲取product_id
   */
  function getProductId()
  {
    $product_id = $this->data["product_id"];
    return $product_id;
  }
}
/**
 * 靜態(tài)鏈接二維碼
 */
class NativeLink_pub extends Common_util_pub
{
  var $parameters;//靜態(tài)鏈接參數(shù)
  var $url;//靜態(tài)鏈接
  function __construct() 
  {
  }
  /**
   * 設(shè)置參數(shù)
   */
  function setParameter($parameter, $parameterValue) 
  {
    $this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
  }
  /**
   * 生成Native支付鏈接二維碼
   */
  function createLink()
  {
    try
    {    
      if($this->parameters["product_id"] == null) 
      {
        throw new SDKRuntimeException("缺少Native支付二維碼鏈接必填參數(shù)product_id!"."<br>");
      }      
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
      $time_stamp = time();
      $this->parameters["time_stamp"] = "$time_stamp";//時(shí)間戳
      $this->parameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//簽名     
      $bizString = $this->formatBizQueryParaMap($this->parameters, false);
      $this->url = "weixin://wxpay/bizpayurl?".$bizString;
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  /**
   * 返回鏈接
   */
  function getUrl() 
  {    
    $this->createLink();
    return $this->url;
  }
}
/**
* JSAPI支付——H5網(wǎng)頁(yè)端調(diào)起支付接口
*/
class JsApi_pub extends Common_util_pub
{
  var $code;//code碼,用以獲取openid
  var $openid;//用戶(hù)的openid
  var $parameters;//jsapi參數(shù),格式為json
  var $prepay_id;//使用統(tǒng)一支付接口得到的預(yù)支付id
  var $curl_timeout;//curl超時(shí)時(shí)間
  function __construct() 
  {
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 作用:生成可以獲得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth3/authorize?".$bizString;
  }
  /**
   * 作用:生成可以獲得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth3/access_token?".$bizString;
  }
  /**
   * 作用:通過(guò)curl向微信提交code,以獲取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //設(shè)置超時(shí)
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //運(yùn)行curl,結(jié)果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:設(shè)置prepay_id
   */
  function setPrepayId($prepayId)
  {
    $this->prepay_id = $prepayId;
  }
  /**
   * 作用:設(shè)置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
  /**
   * 作用:設(shè)置jsapi的參數(shù)
   */
  public function getParameters()
  {
    $jsApiObj["appId"] = WxPayConf_pub::APPID;
    $timeStamp = time();
    $jsApiObj["timeStamp"] = "$timeStamp";
    $jsApiObj["nonceStr"] = $this->createNoncestr();
    $jsApiObj["package"] = "prepay_id=$this->prepay_id";
    $jsApiObj["signType"] = "MD5";
    $jsApiObj["paySign"] = $this->getSign($jsApiObj);
    $this->parameters = json_encode($jsApiObj);
    return $this->parameters;
  }
}
/**
 * 現(xiàn)金紅包接口
 * @author gaoyl101
 */
class Redpack_pub extends Wxpay_client_pub
{
  var $code;//code碼,用以獲取openid
  var $openid;//用戶(hù)的openid
  function __construct()
  {
    //設(shè)置接口鏈接
    $this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口參數(shù)xml
   */
  function createXml()
  {
    try
    {
      //檢測(cè)必填參數(shù)
      if($this->parameters["mch_billno"] == null)
      {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)mch_billno!"."<br>");
      }elseif($this->parameters["nick_name"] == null){
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)nick_name!"."<br>");
      }elseif ($this->parameters["send_name"] == null ) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)send_name!"."<br>");
      }elseif ($this->parameters["total_amount"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)total_amount!"."<br>");
      }elseif($this->parameters["min_value"] == null){
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)min_value!"."<br>");
      }elseif ($this->parameters["max_value"] == null ) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)max_value!"."<br>");
      }elseif ($this->parameters["total_num"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)total_num!"."<br>");
      }elseif ($this->parameters["wishing"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)wishing!"."<br>");
      }elseif ($this->parameters["act_name"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)act_name!"."<br>");
      }elseif ($this->parameters["remark"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)remark!"."<br>");
      }
      $this->parameters["wxappid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
      $this->parameters["client_ip"] = $_SERVER['REMOTE_ADDR'];//終端ip
      $this->parameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
      $this->parameters["re_openid"] = $this->parameters["re_openid"];
      //$this->openid;//用戶(hù)openid
      $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function sendRedpack()
  {
    $this->postXmlSSL();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
  /**
   * 作用:生成可以獲得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth3/authorize?".$bizString;
  }
  /**
   * 作用:生成可以獲得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth3/access_token?".$bizString;
  }
  /**
   * 作用:通過(guò)curl向微信提交code,以獲取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //設(shè)置超時(shí)
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //運(yùn)行curl,結(jié)果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:設(shè)置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}
/**
 * 紅包支付接口
 * @author gaoyl101
 */
class Groupredpack_pub extends Wxpay_client_pub
{
  var $code;//code碼,用以獲取openid
  var $openid;//用戶(hù)的openid
  function __construct()
  {
    //設(shè)置接口鏈接
    $this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack";
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口參數(shù)xml
   */
  function createXml()
  {
    try
    {
      //檢測(cè)必填參數(shù)
      if($this->parameters["mch_billno"] == null)
      {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)mch_billno!"."<br>");
      }elseif ($this->parameters["send_name"] == null ) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)send_name!"."<br>");
      }elseif ($this->parameters["total_amount"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)total_amount!"."<br>");
      }elseif ($this->parameters["total_num"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)total_num!"."<br>");
      }elseif ($this->parameters["amt_type"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)amt_type!"."<br>");
      }elseif ($this->parameters["wishing"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)wishing!"."<br>");
      }elseif ($this->parameters["act_name"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)act_name!"."<br>");
      }elseif ($this->parameters["remark"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)remark!"."<br>");
      }
      $this->parameters["wxappid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
      $this->parameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
      $this->parameters["re_openid"] = $this->openid;//用戶(hù)openid
      $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function sendRedpack()
  {
    $this->postXmlSSL();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
  /**
   * 作用:生成可以獲得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth3/authorize?".$bizString;
  }
  /**
   * 作用:生成可以獲得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth3/access_token?".$bizString;
  }
  /**
   * 作用:通過(guò)curl向微信提交code,以獲取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //設(shè)置超時(shí)
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //運(yùn)行curl,結(jié)果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:設(shè)置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}
/**
 * 搖一搖紅包預(yù)下單 
 * @author jiosen
 */
class Yhb_pub extends Wxpay_client_pub
{
  var $code;//code碼,用以獲取openid
  var $openid;//用戶(hù)的openid
  function __construct()
  {
    //設(shè)置接口鏈接
    $this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder";
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口參數(shù)xml
   */
  function createXml()
  {
    try
    {
      //檢測(cè)必填參數(shù)
      if($this->parameters["mch_billno"] == null)
      {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)mch_billno!"."<br>");
      }elseif ($this->parameters["send_name"] == null ) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)send_name!"."<br>");
      }elseif ($this->parameters["total_amount"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)total_amount!"."<br>");
      }elseif ($this->parameters["total_num"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)total_num!"."<br>");
      }elseif ($this->parameters["wishing"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)wishing!"."<br>");
      }elseif ($this->parameters["act_name"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)act_name!"."<br>");
      }elseif ($this->parameters["remark"] == null) {
        throw new SDKRuntimeException("缺少發(fā)紅包接口必填參數(shù)remark!"."<br>");
      }
      $this->parameters["wxappid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶(hù)號(hào)
      $this->parameters["nonce_str"] = $this->createNoncestr();//隨機(jī)字符串
      //$this->parameters["re_openid"] = $this->openid;//用戶(hù)openid
      $this->parameters["hb_type"] = 'NORMAL';//紅包類(lèi)型 NORMAL-普通紅包;GROUP-裂變紅包(可分享紅包給好友,無(wú)關(guān)注公眾號(hào)能力)。 
      $this->parameters["auth_mchid"] = '1000052601';//搖周邊商戶(hù)號(hào)
      $this->parameters["auth_appid"] = 'wxbf42bd79c4391863';//搖周邊 appid
      $this->parameters["risk_cntl"] = 'NORMAL';//風(fēng)控設(shè)置
      $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
      //echo json_encode($this->parameters);die;
      return $this->arrayToXml($this->parameters);
      //echo $this->parameters["auth_appid"].'--'.$this->parameters["auth_mchid"];die;
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function hbpreorder()
  {
    $this->postXmlSSL();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
  /**
   * 作用:生成可以獲得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth3/authorize?".$bizString;
  }
  /**
   * 作用:生成可以獲得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth3/access_token?".$bizString;
  }
  /**
   * 作用:通過(guò)curl向微信提交code,以獲取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //設(shè)置超時(shí)
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //運(yùn)行curl,結(jié)果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:設(shè)置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}
/**
 * 搖一搖紅包 創(chuàng)建活動(dòng)
 * @author jiosen
 */
class addlotteryinfo_pub extends Wxpay_client_pub
{
  var $code;//code碼,用以獲取openid
  var $openid;//用戶(hù)的openid
  function __construct($access_token,$logo)
  {
    //設(shè)置接口鏈接
    $this->url = "https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=".$access_token."&use_template=1&logo_url=".$logo;
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口參數(shù) json
   */
  function createJson()
  {
    try
    {
      //檢測(cè)必填參數(shù)
      if($this->parameters["title"] == null)
      {
        throw new SDKRuntimeException("缺少抽獎(jiǎng)活動(dòng)名稱(chēng)title!"."<br>");
      }elseif ($this->parameters["desc"] == null ) {
        throw new SDKRuntimeException("缺少抽獎(jiǎng)活動(dòng)描述desc!"."<br>");
      }elseif ($this->parameters["begin_time"] == null) {
        throw new SDKRuntimeException("缺少活動(dòng)開(kāi)始時(shí)間 begin_time!"."<br>");
      }elseif ($this->parameters["expire_time"] == null) {
        throw new SDKRuntimeException("缺少活動(dòng)結(jié)束時(shí)間 expire_time!"."<br>");
      }elseif ($this->parameters["total"] == null) {
        throw new SDKRuntimeException("缺少紅包總數(shù)total!"."<br>");
      }elseif ($this->parameters["jump_url"] == null) {
        throw new SDKRuntimeException("缺少紅包關(guān)注跳轉(zhuǎn)連接jump_url!"."<br>");
      }elseif ($this->parameters["key"] == null) {
        throw new SDKRuntimeException("缺少紅包key!"."<br>");
      }
      $this->parameters["title"] = urlencode($this->parameters["title"]);
      $this->parameters["desc"] = urlencode($this->parameters["desc"]);
      $this->parameters["onoff"] = '0';//開(kāi)啟活動(dòng)
      $this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//公眾賬號(hào)ID
      //var_dump($this->parameters);
      //echo json_encode($this->parameters);
      return json_encode($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function hbpreorder()
  {
    $data = $this->createJson();
    $result = $this->curl_post($this->url,urldecode($data));
    $result = json_decode($result);
    return $result;
  }
  function curl_post($url,$data)
  {
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_POST, 1);//發(fā)送一個(gè)常規(guī)的Post請(qǐng)求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的數(shù)據(jù)包
    $rv = curl_exec($curl);//輸出內(nèi)容
    curl_close($curl);
    return $rv;
  }
  /**
   * 作用:生成可以獲得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth3/authorize?".$bizString;
  }
  /**
   * 作用:生成可以獲得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth3/access_token?".$bizString;
  }
  /**
   * 作用:通過(guò)curl向微信提交code,以獲取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //設(shè)置超時(shí)
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //運(yùn)行curl,結(jié)果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:設(shè)置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}
/**
 * 搖一搖紅包 錄入紅包
 * @author jiosen
 */
class lottery_pub extends Wxpay_client_pub
{
  var $code;//code碼,用以獲取openid
  var $openid;//用戶(hù)的openid
  function __construct($access_token)
  {
    //設(shè)置接口鏈接
    $this->url = "https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=".$access_token;
    //設(shè)置curl超時(shí)時(shí)間
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口參數(shù) json
   */
  function createJson()
  {
    try
    {
      //檢測(cè)必填參數(shù)
      if($this->parameters["lottery_id"] == null)
      {
        throw new SDKRuntimeException("缺少抽獎(jiǎng)活動(dòng)id lottery_id !"."<br>");
      }else if(empty($this->parameters["prize_info_list"])){
        throw new SDKRuntimeException("缺少抽獎(jiǎng)活動(dòng)紅包 prize_info_list !"."<br>");
      }
      $this->parameters["mchid"] = WxPayConf_pub::MCHID;//授權(quán)商戶(hù)號(hào)
      $this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//授權(quán)上號(hào)appid
      return json_encode($this->parameters);
      //echo json_encode($this->parameters);die;
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function setJsonArray($parameter, $parameterValue){
    $this->parameters[$this->trimString($parameter)] = $parameterValue;
  }
  function hbpreorder()
  {
    $data = $this->createJson();
    $result = $this->curl_post($this->url,$data);
    $result = json_decode($result);
    return $result;
  }
  function curl_post($url,$data)
  {
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_POST, 1);//發(fā)送一個(gè)常規(guī)的Post請(qǐng)求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的數(shù)據(jù)包
    $rv = curl_exec($curl);//輸出內(nèi)容
    curl_close($curl);
    return $rv;
  }
  /**
   * 作用:生成可以獲得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth3/authorize?".$bizString;
  }
  /**
   * 作用:生成可以獲得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth3/access_token?".$bizString;
  }
  /**
   * 作用:通過(guò)curl向微信提交code,以獲取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //設(shè)置超時(shí)
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //運(yùn)行curl,結(jié)果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:設(shè)置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}
?>

關(guān)于“如何使用PHP實(shí)現(xiàn)微信搖一搖周邊紅包”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI