微信企業紅包開發(php)

微信的開發真的有點麻煩,不是難,就是煩,細節多,東西多,關聯多

這裏記錄下 微信企業紅包開發的整個過程(弄完的話  微信支付 也差不多了,代碼是 php的)

  1. 申請:這裏只說簡單的過程
    • 先申請公衆服務號
    • 在服務號中申請‘微信支付’(登錄公衆號平臺首頁左面有這個菜單),覺得微信在推廣移動支付,所以還是很好申請的,關於申請中填寫的網站最好做一個購買的演示鏈接,這樣可能更容易下來。
  2. 證書
    • 微信支付申請下來了,那麼你有了一個 微信的 商戶號和登錄密碼 (會發郵件給你)
    • 還是從申請微信支付哪裏 點到  微信商戶登錄頁面
    • 進去先看 [賬戶管理]設置證書 安裝證書 設置證書的 api祕鑰(這個是開發的簽名key 自己保存好) 然後下載開發用的證書,反正都在這個大菜單裏
    • 下載了證書 放到一個安全點的目錄(我是用php開發 linux環境,和window可能有點小區別) 注意這個目錄不要是 web服務的目錄 不然被別人下載了  呵呵。。
  3. 開發代碼整理
    • 老規矩直接找別人的代碼,找到一個看起來靠譜的,尼瑪 6個文件。。。說真的 看demo的時候 我特別討厭 封裝
    • 下面是我自己整理的代碼,實際測試ok的時間 不足整理時間的 十分之一 再次無語(不過還是要謝謝 放代碼的兄弟)
    • 注意 所有方法全要 放一個php 類裏就可以了 GrantHongbao是入口方法  下面的參數自己換一下
    • 注意 證書目錄  替換成你 保存證書的目錄
    • </pre></li></ul></ol></p><pre name="code" class="plain">
      public function GrantHongbao(){ //發送紅包
              
              $PARTNERKEY = C('WEIXINPAYAPIKEY');     //商戶的簽名加密key
              $APPMCHID = C('WEIXINMCHID');                         //微信商戶號
              $WEIXINAPPID = C('WEIXINAPPID');                       //微信的appid
              $BILLNO = $this->app_mchid.date('YmdHis').rand(1000, 9999); //訂單號
              
              $openid = C('KKOPENID');                           //收紅包的人的openid
              
              $acount = 100;          //發放的金額(單位分)
              
              $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';   //api url
              
              $ip = '101.45.174.67';  //本機ip
              
              $parames = array();


              $parames["nonce_str"] = $this->great_rand();//隨機字符串,丌長於 32 位
              $parames["mch_billno"] = $BILLNO;//訂單號
              
              $parames["mch_id"] = $APPMCHID;//商戶號
              $parames["wxappid"] = $WEIXINAPPID;
              
              $parames["nick_name"] = '紅包nick_name';//提供方名稱
              $parames["send_name"] = 'KK';//紅包發送者名稱
              $parames["re_openid"] = $openid;//openid
              
              $parames["total_amount"] = $acount;//付款金額,單位分
              $parames["min_value"] = $acount;//最小紅包金額,單位分
              $parames["max_value"] = $acount;//最大紅包金額,單位分
              $parames["total_num"] = 1;//紅包収放總人數
              
              $parames["wishing"] = '發個紅包真不容易...';//紅包祝福
              
              $parames["client_ip"] = $ip;//調用接口的機器 Ip 地址
              
              $parames["act_name"] = 'kk測試紅包';//活勱名稱
              
              $parames["remark"] = '快來搶!(沒了別來了)';//
              
              $parames["sign"] = $this->get_sign($parames, $PARTNERKEY);//參數簽名
              
             
              //var_dump($parames);
              
              //轉成xml字符串
              $postXml = $this->array2Xmlstring($parames);            
              
              
              
              //echo '<br>';
              //var_dump($postXml);
              
              //向微信老大發起請求
              $responseXml = $this->curl_post_ssl($url, $postXml);
              
              //echo '<br>$responseXml<br>';
              var_dump($responseXml);
              
              
              $responseObj = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
              
              echo $responseObj->return_code;


          }
          
          /**
           *獲取參數列表的簽名
           * @param type $parameters
           * @param type $PARTNERKEY:簽名的祕鑰
           * @return type 
           */
          protected function get_sign($parameters, $PARTNERKEY){
              
              //字典排序
              ksort($parameters);
              
              $unSignParaString = $this->formatQueryParaMap($parameters, false);
              //要簽名的字符串
              $signStr = $unSignParaString . "&key=" . $PARTNERKEY;
              
              return strtoupper(md5($signStr));


          }
          /**
           *將參數列表轉化爲連接字符串
           * @param type $paraMap
           * @param type $urlencode
           * @return type 
           */
          protected function formatQueryParaMap($paraMap, $urlencode){
              $buff = "";
              foreach ($paraMap as $k => $v){
                      if (null != $v && "null" != $v && "sign" != $k) {
                          if($urlencode){
                              $v = urlencode($v);
                          }
                          $buff .= $k . "=" . $v . "&";
                      }
              }
              $reqPar;
              if (strlen($buff) > 0) {
                      $reqPar = substr($buff, 0, strlen($buff)-1);
              }
              return $reqPar;
          }
          /**
           *生成隨機數(默認30位長度)
           * @return string 
           */
          protected function great_rand($length = 30){
              $str = '1234567890abcdefghijklmnopqrstuvwxyz';
              for($i=0;$i<$length;$i++){
                  $j=rand(0,35);
                  $t1 .= $str[$j];
              }
              return $t1;    
          }
          /**
           *數組轉xml串
           * @param type $arr
           * @return string 
           */
          protected function array2Xmlstring($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; 
          }
          /**
           * 訪問微信接口
           * @param type $url
           * @param type $vars
           * @param type $second
           * @param type $aHeader
           * @return boolean 
           */
          protected 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_URL,$url);
              curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
              curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);


              //cert 與 key 分別屬於兩個.pem文件
              curl_setopt($ch,CURLOPT_SSLCERT,'證書保存路徑'.'apiclient_cert.pem');
              curl_setopt($ch,CURLOPT_SSLKEY,'證書保存路徑'.'apiclient_key.pem');
              curl_setopt($ch,CURLOPT_CAINFO,'證書保存路徑'.'rootca.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);
                      curl_close($ch);
                      return $error;
              }
          }
      
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章