1. 程式人生 > >小程式的支付的完整程式碼(php)

小程式的支付的完整程式碼(php)

小程式的支付的完整程式碼(php)

下面為後臺程式碼

 function pay(){
         $openid = "使用者的openid"  
         $money ="需要支付的金額" ;  // 
        (!$lawyer_id) &&  $this->response(500,"引數錯誤");
        (!$money)  &&  $this->response(500,"選擇金額錯誤!");
        $orderCode = date("YmdHis");   //  訂單號
//        隨機字串
        $str="QWERTYUIPADGHJKLZXCVNM1234567890";
        $nonce = str_shuffle($str);
        $appid = '你的小程式appid';  
        $key = "你的商戶祕鑰";  
        $mch_id = "你的商戶號";  
        $pay['appid'] = $appid;
        $pay['body'] = 'test';               //商品描述
        $pay['mch_id'] = $mch_id;            //商戶號
        $pay['nonce_str'] = $nonce;        //隨機字串
        $pay['notify_url'] = '非同步接收微信支付結果通知的回撥地址';
        $pay['openid'] = $openid;
        $pay['out_trade_no'] = $orderCode;       //訂單號
        $pay['spbill_create_ip'] = $_SERVER['SERVER_ADDR']; // 終端IP
        $pay['total_fee'] = 100*$money; //支付金額
        $pay['trade_type'] = 'JSAPI';    //交易型別
//        組建簽名(不可換行 空格  否則哭吧)
        $stringA="appid=".$pay['appid']."&body=".$pay['body']."&mch_id=".$pay['mch_id']."&nonce_str=".$pay['nonce_str']."&notify_url=".$pay['notify_url']."&openid=". $pay['openid']."&out_trade_no=".$pay['out_trade_no']."&spbill_create_ip=". $pay['spbill_create_ip']."&total_fee=".$pay['total_fee']."&trade_type=".$pay['trade_type'];
        $stringSignTemp=$stringA."&key=".$key; //注:key為商戶平臺設定的金鑰key(這個還需要再確認一下)
        $sign= strtoupper(md5($stringSignTemp)); //注:MD5簽名方式
        $pay['sign'] = $sign;              //簽名
//        統一下單請求
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        $data = $this->arrayToXml($pay);
//        return $data;
        $res = $this->wxpost($url,$data);
//        return $res;  //返回統一下單結果
//        對 統一下單返回得引數進行處理
        $pay_arr = $this->xmlToArray($res);  //這裡是陣列
        if ($pay_arr['return_code'] == 'FAIL' || $pay_arr['result_code'] == 'FAIL')
        {
            echo  json_encode($res);exit;
//            return $res;
        }
//        調起支付資料簽名欄位
        $timeStamp = time();
        $nonce_pay = str_shuffle($str);
        $package = $pay_arr['prepay_id'];
        $signType = "MD5";
        $stringPay = "appId=".$appid."&nonceStr=".$nonce_pay."&package=prepay_id=".$package."&signType=".$signType."&timeStamp=".$timeStamp."&key=".$key;
        $paySign = strtoupper(md5($stringPay));
        $rpay['timeStamp'] = (string)$timeStamp;
        $rpay['nonceStr'] = $nonce_pay;
        $rpay['package'] = "prepay_id=".$package;
        $rpay['signType'] = $signType;
        $rpay['paySign'] = $paySign;
        $rpay['orders'] =  $orderCode ;  //訂單流水號id    $order
        echo   json_encode($rpay);
    }

非同步處理函式

 function notify_url(){
        $receipt = $_REQUEST;
        if($receipt==null){
            $receipt = file_get_contents("php://input");
        }
        if($receipt == null){
            $receipt = $GLOBALS['HTTP_RAW_POST_DATA'];
        }
        $post_data = $this->xmlToArray($receipt);
        $postSign = $post_data['sign'];
        unset($post_data['sign']);
        ksort($post_data);// 對資料進行排序
        $str =  $params = http_build_query($post_data);//對陣列資料拼接成key=value字串
        $user_sign = strtoupper(md5($str));   //再次生成簽名,與$postSign比較
        $ordernumber = $post_data['out_trade_no'];// 訂單可以檢視一下資料庫是否有這個訂單
        if($post_data['return_code']=='SUCCESS'&& $postSign == $user_sign){
            // 查詢訂單是否已經支付(通過訂單號調取微信的查詢訂單的介面)
            //如果已經支付 更改資料庫中的 支付狀態 並寫入日誌表
            file_put_contents('wxPaylog.txt',$res);
            if($result['data']){
                // 進行更改支付成功狀態
            }else{
                echo '微信支付失敗,資料未存在該訂單。';
            }
        }else{
             // 寫個日誌記錄
             file_put_contents('wxPaylog.txt',$post_data['return_code'].PHP_EOL, FILE_APPEND);
             echo '微信支付失敗';
             echo  "success";
         }
    }

post 請求

     function wxpost($url,$post)
    {
        //初始化
        $curl = curl_init();
        $header[] = "Content-type: text/xml";//定義content-type為xml
        //設定抓取的url
        curl_setopt($curl, CURLOPT_URL, $url);
        //設定標頭檔案的資訊作為資料流輸出
//        curl_setopt($curl, CURLOPT_HEADER, 1);
        //定義請求型別
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        //設定獲取的資訊以檔案流的形式返回,而不是直接輸出。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        //設定post方式提交
        curl_setopt($curl, CURLOPT_POST, 1);
        //設定post資料
        $post_data = $post;
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
        //執行命令
        $data = curl_exec($curl);
        //關閉URL請求
        //顯示獲得的資料
//        print_r($data);
        if ($data)
        {
            curl_close($curl);
            return $data;
        }else{
            $res = curl_error($curl);
            curl_close($curl);
            return $res;
        }
    }

將陣列轉化為xml資料格式

     function arrayToXml($arr){
        $xml = "<xml>";
        foreach ($arr as $key=>$val){
            if(is_array($val)){
                $xml.="<".$key.">".$this->arrayToXml($val)."</".$key.">";
            }else{
                $xml.="<".$key.">".$val."</".$key.">";
            }
        }
        $xml.="</xml>";
        return $xml;
    }

將XML轉化為json/陣列

     function xmlToArray($xml,$type='')
    {
        //禁止引用外部xml實體
        libxml_disable_entity_loader(true);
        //simplexml_load_string()解析讀取xml資料,然後轉成json格式
        $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
        if ($type == "json") {
            $json = json_encode($xmlstring);
            return $json;
        }
        $arr = json_decode(json_encode($xmlstring), true);
        return $arr;
    }

小程式程式碼

 wx.request({
      url: '請求引數的地址獲得下面呼叫支付時需要的引數',
      data: {'需要傳入後臺的引數'},
      success: function (res) {
        var rest = res.data;
        console.log(rest)
        // 呼叫支付介面開始
        wx.requestPayment({
          timeStamp: rest.timeStamp,
          nonceStr: rest.nonceStr,
          package: rest.package,
          signType: rest.signType,
          paySign: rest.paySign,
          success: function(res) {
            console.log(res)
          },
          fail: function(res) {
            console.log(res)
          },
          complete: function(res) {
            console.log(res)
          },
        })
      }
    })