讀古今文學網 > 微信公眾平台開發:從零基礎到ThinkPHP5高性能框架實踐 > 17.6.1 普通紅包 >

17.6.1 普通紅包

微信普通紅包是指發放紅包時,一次只有一個用戶的形式。

發放普通紅包的接口如下。


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

發放普通紅包時,POST數據示例如下。


<xml>
    <sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>
    <mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>
    <mch_id><![CDATA[888]]></mch_id>
    <wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>
    <send_name><![CDATA[send_name]]></send_name>
    <re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>
    <total_amount><![CDATA[200]]></total_amount>
    <total_num><![CDATA[1]]></total_num>
    <wishing><![CDATA[恭喜發財]]></wishing>
    <client_ip><![CDATA[127.0.0.1]]></client_ip>
    <act_name><![CDATA[新年紅包]]></act_name>
    <remark><![CDATA[新年紅包]]></remark>
    <scene_id><![CDATA[PRODUCT_2]]></scene_id>
    <consume_mch_id><![CDATA[10000097]]></consume_mch_id>
    <nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str>
    <risk_info>posttime%3d123123412%26clientversion%3d234134%26mobile%3d122344545%26
    deviceid%3dIOS</risk_info>
</xml>
  

同時,發送普通紅包時需要帶上文件證書,提高安全級別。

上述數據的參數說明如表17-6所示。

表17-6 發放普通紅包接口的參數說明

正確創建時,返回的數據示例如下。


<xml>
    <return_code><![CDATA[SUCCESS]]></return_code>
    <return_msg><![CDATA[發放成功.]]></return_msg>
    <result_code><![CDATA[SUCCESS]]></result_code>
    <err_code><![CDATA[0]]></err_code>
    <err_code_des><![CDATA[發放成功.]]></err_code_des>
    <mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>
    <mch_id>10010404</mch_id>
    <wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>
    <re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>
    <total_amount>1</total_amount>
</xml>
  

上述數據的參數說明如表17-7所示。

表17-7 發放普通紅包接口返回參數說明

微信紅包接口類的實現代碼如下。


  1 class WxPay
  2 {
  3     var $appid = APPID;
  4     var $appsecret = APPSECRET;
  5 
  6     // 構造函數,獲取Access Token
  7     public function __construct($appid = NULL, $appsecret = NULL)
  8     {
  9         if($appid && $appsecret){
 10             $this->appid = $appid;
 11             $this->appsecret = $appsecret;
 12 
 13             // 3. 本地寫入
 14             $res = file_get_contents('access_token.json');
 15             $result = json_decode($res, true);
 16             $this->expires_time = $result["expires_time"];
 17             $this->access_token = $result["access_token"];
 18             if (time > ($this->expires_time + 3600)){
 19                 $url = "https:// api.weixin.qq.com/cgi-bin/token?grant_type=client_
                    credential&appid=".$this->appid."&secret=".$this->appsecret;
 20                 var_dump($url);
 21                 $res = $this->http_request($url, null, false);
 22                 $result = json_decode($res, true);
 23                 $this->access_token = $result["access_token"];
 24                 $this->expires_time = time;
 25                 file_put_contents('access_token.json', '{"access_token": "'.$this-
                    >access_token.'", "expires_time": '.$this->expires_time.'}');
 26             }
 27         }
 28     }
 29 
 30     // 發起支付請求
 31     function wxpay($url, $obj, $cert = false)
 32     {
 33         $obj['nonce_str'] = $this->create_noncestr;
 34         $stringA = $this->formatQueryParaMap($obj, false);
 35         $stringSignTemp = $stringA . "&key=" . PARTNERKEY;
 36         $sign = strtoupper(md5($stringSignTemp));
 37         $obj['sign'] = $sign;
 38         $postXml = $this->arrayToXml($obj);
 39         $responseXml = $this->http_request($url, $postXml, $cert);
 40         return $responseXml;
 41     }
 42 
 43     // 隨機字符串
 44     function create_noncestr($length = 32)
 45     {
 46         $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 47         $str = "";
 48         for ( $i = 0; $i < $length; $i++ )  {
 49             $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
 50         }
 51         return $str;
 52     }
 53 
 54     // 格式化字符串
 55     function formatQueryParaMap($paraMap, $urlencode)
 56     {
 57         $buff = "";
 58         ksort($paraMap);
 59         foreach ($paraMap as $k => $v){
 60             if (null != $v && "null" != $v && "sign" != $k) {
 61                 if($urlencode){
 62                    $v = urlencode($v);
 63                 }
 64                 $buff .= $k . "=" . $v . "&";
 65             }
 66         }
 67         $reqPar;
 68         if (strlen($buff) > 0) {
 69             $reqPar = substr($buff, 0, strlen($buff)-1);
 70         }
 71         return $reqPar;
 72     }
 73 
 74     // 數組轉XML
 75     function arrayToXml($arr)
 76     {
 77         $xml = "<xml>";
 78         foreach ($arr as $key=>$val)
 79         {
 80             if (is_numeric($val)){
 81                 $xml.="<".$key.">".$val."</".$key.">";
 82             }else{
 83                  $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
 84             }
 85         }
 86         $xml.="</xml>";
 87         return $xml;
 88     }
 89 
 90     // 將XML轉為array
 91     function xmlToArray($xml)
 92     {    
 93         // 禁止引用外部XML實體
 94         libxml_disable_entity_loader(true);
 95         $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', 
            LIBXML_NOCDATA)), true);
 96         return $values;
 97     }
 98 
 99     // 帶證書的POST請求
100     function http_request($url, $fields = null, $cert = true)
101     {
102         $ch = curl_init;
103         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
104         curl_setopt($ch, CURLOPT_URL, $url);
105         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
106         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
107         curl_setopt($ch, CURLOPT_SSLCERT, 'cert'.DIRECTORY_SEPARATOR.'apiclient_
            cert.pem');
108         curl_setopt($ch, CURLOPT_SSLKEY, 'cert'.DIRECTORY_SEPARATOR.'apiclient_
            key.pem');
109         curl_setopt($ch, CURLOPT_CAINFO, 'cert'.DIRECTORY_SEPARATOR.'rootca.pem');
110         if (!empty($fields)){
111             curl_setopt($ch, CURLOPT_POST, 1);
112             curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
113         }
114         $data = curl_exec($ch);
115         if(!$data){echo "CURL ErrorCode: ".curl_errno($ch);}
116         curl_close($ch);
117         return $data;
118     }
119 }
 

調用微信紅包的方法如下。


 1 $money = 101;
 2 $sender = "方倍工作室";
 3 $obj = array;
 4 $obj['wxappid']         = APPID;
 5 $obj['mch_id']          = MCHID;
 6 $obj['mch_billno']      = MCHID.date('YmdHis').rand(1000, 9999);
 7 $obj['client_ip']       = $_SERVER['REMOTE_ADDR'];
 8 $obj['re_openid']       = $openid;
 9 $obj['total_amount']    = $money;
10 $obj['total_num']       = 1;
11 $obj['nick_name']       = $sender;
12 $obj['send_name']       = $sender;
13 $obj['wishing']         = "恭喜發財";
14 $obj['act_name']        = "猜燈謎搶紅包";
15 $obj['remark']          = "猜越多得越多";
16 var_dump($obj);
17 $url = 'https:// api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
18 $wxHongBaoHelper = new WxPay;
19 $data = $wxHongBaoHelper->wxpay($url, $obj, true);
20 $res = $wxHongBaoHelper->xmlToArray($data);
21 var_dump($res);
  

執行上述代碼後,用戶將收到紅包,效果如圖17-9所示。

圖17-9 微信支付普通紅包