微信支付統一下單dome(小程序,掃碼)

回調代碼會在下一篇中附上,具體解釋也在回調那篇文章,結合來看就比較容易做出來了, 

<?php //微信支付

/**

 * 適用於微信所有支付, 掃碼支付 小程序支付   二維碼的需要接入生成二維碼的代碼,這個可以共用

*    xml 根據文檔自行刪改, 共用微信統一下單dome 

 */    
class Payapi
{

        統一下單
      public function Pay($orderid,$total_fee){   參數是訂單號 加金額,  可以改動, 
          $fee = $total_fee;//舉例充值0.01
          $appid ='';//如果是公衆號 就是公衆號的appid
          $body = '名字';
          $mch_id ='商戶號';
          $nonce_str = $this->nonce_str();//隨機字符串
          $notify_url ='回調地址';
          $out_trade_no = $orderid;//商戶訂單號
          $spbill_create_ip = '主機ip';
          $total_fee = $fee*100;//因爲充值金額最小是1 而且單位爲分 如果是充值1元所以這裏需要*100
          $trade_type = 'NATIVE';//交易類型 默認


          //這裏是按照順序的 因爲下面的簽名是按照順序 排序錯誤 肯定出錯
          $post['appid'] = $appid;
          $post['body'] = $body;
          $post['mch_id'] = $mch_id;
          $post['nonce_str'] = $nonce_str;//隨機字符串
          $post['notify_url'] = $notify_url;
        //  $post['openid'] = $openid;
          $post['out_trade_no'] = $out_trade_no;
          $post['spbill_create_ip'] = $spbill_create_ip;//終端的ip
          $post['total_fee'] = $total_fee;//總金額 最低爲一塊錢 必須是整數
          $post['trade_type'] = $trade_type;
          $sign = $this->sign($post);//簽名
          $post_xml = '<xml>
                 <appid>'.$appid.'</appid>
                 <body>'.$body.'</body>
                 <mch_id>'.$mch_id.'</mch_id>
                 <nonce_str>'.$nonce_str.'</nonce_str>
                 <notify_url>'.$notify_url.'</notify_url>
                 <openid>'.$openid.'</openid>
                 <out_trade_no>'.$out_trade_no.'</out_trade_no>
                 <spbill_create_ip>'.$spbill_create_ip.'</spbill_create_ip>
                 <total_fee>'.$total_fee.'</total_fee>
                 <trade_type>'.$trade_type.'</trade_type>
                 <sign>'.$sign.'</sign>
              </xml> ';
          //統一接口prepay_id
          $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
          $xml = $this->http_request($url,$post_xml);
          $array = $this->xml($xml);//全要大寫
          if($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS'){
              $time = time();
              $tmp='';//臨時數組用於簽名
              $tmp['appId'] = $appid;
              $tmp['nonceStr'] = $nonce_str;
              $tmp['package'] = 'prepay_id='.$array['PREPAY_ID'];
              $tmp['signType'] = 'MD5';
              $tmp['timeStamp'] = "$time";
              $data['state'] = 1;
              $data['timeStamp'] ="$time";//時間戳
              $data['nonceStr'] = $nonce_str;//隨機字符串
              $data['signType'] = 'MD5';//簽名算法,暫支持 MD5
              $data['package'] = 'prepay_id='.$array['PREPAY_ID'];//統一下單接口返回的 prepay_id 參數值,提交格式如:prepay_id=*
              $data['paySign'] = $this->sign($tmp);//簽名,具體簽名方案參見微信公衆號支付幫助文檔;
              $data['out_trade_no'] = $out_trade_no;
               $data['CODE_URL']  =$array['CODE_URL'];
          }else{
              $data['state'] = 0;
              $data['text'] = "錯誤";
              $data['RETURN_CODE'] = $array['RETURN_CODE'];
              $data['RETURN_MSG'] = $array['RETURN_MSG'];
          }
        return  json_encode($data);

      }



private function nonce_str(){//隨即字符串
          $result = '';
          $str = 'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz';
          for ($i=0;$i<32;$i++){
              $result .= $str[rand(0,48)];
          }
          return $result;
      }




      //生成訂單號
      private function order_number($openid){
        // date('Ymd',time()).time().rand(10,99);//18位
      return md5($openid.time().rand(10,99));//32位
      }



      //簽名 $data要先排好順序
      private function sign($data){
      ksort($data);
          $stringA = '';
          foreach ($data as $key=>$value){
              if(!$value) continue;
              if($stringA) $stringA .= '&'.$key."=".$value;
              else $stringA = $key."=".$value;
          }
          $wx_key = '';//申請支付後有給予一個商戶賬號和密碼,登陸後自己設置key
      $stringSignTemp = $stringA.'&key='.$wx_key;//申請支付後有給予一個商戶賬號和密碼,登陸後自己設置key
      return strtoupper(md5($stringSignTemp));
    }
      //curl請求啊
      function http_request($url,$data = null,$headers=array())
      {
          $curl = curl_init();
          if( count($headers) >= 1 ){
              curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
          }
          curl_setopt($curl, CURLOPT_URL, $url);


          curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
          curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);


          if (!empty($data)){
              curl_setopt($curl, CURLOPT_POST, 1);
              curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
          }
          curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
          $output = curl_exec($curl);
          curl_close($curl);
          return $output;
      }


      //獲取xml
      public function xml($xml){
          $p = xml_parser_create();
          xml_parse_into_struct($p, $xml, $vals, $index);
          xml_parser_free($p);
          $data = "";
          foreach ($index as $key=>$value) {
              if($key == 'xml' || $key == 'XML') continue;
              $tag = $vals[$value[0]]['tag'];
              $value = $vals[$value[0]]['value'];
              $data[$tag] = $value;
          }
          return $data;
      }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章