小程式的支付的完整程式碼(php)
阿新 • • 發佈:2018-11-27
小程式的支付的完整程式碼(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']."¬ify_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)
},
})
}
})