小程序支付功能签名报错,prepay_id为undefined
生活随笔
收集整理的這篇文章主要介紹了
小程序支付功能签名报错,prepay_id为undefined
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簽名報錯的幾種可能性
1.appid和mch_id(微信支付商戶支付號)不匹配,appid是小程序id machid進入https://pay.weixin.qq.com/index.php/core/cert/api_cert關聯appid獲取machid
2.在https://pay.weixin.qq.com/index.php/core/cert/api_cert手動填寫32位key值
PHP完成微信小程序在線支付功能
小程序訪問地址:payfee.php 如果使用 TP 框架處理后臺的話,寫成方法即可
include 'WeixinPay.php'; $appid=''; //小程序appid $openid= $_POST['id']; $mch_id=''; //微信支付商戶支付號 $key=''; //Api密鑰 $out_trade_no = $mch_id. time(); $total_fee = $_POST['fee']; if (empty($total_fee)) { //押金$body = "充值押金";$total_fee = floatval(99*100); } else {$body = "充值余額";$total_fee = floatval($total_fee*100);} $weixinpay = new WeixinPay($appid,$openid,$mch_id,$key,$out_trade_no,$body,$total_fee); $return=$weixinpay->pay();echo json_encode($return);WeixinPay.php 微信小程序支付類 所有微信小程序需要的參數都已經寫入
<?php/** 小程序微信支付*/ class WeixinPay {protected $appid;protected $mch_id;protected $key;protected $openid;protected $out_trade_no;protected $body;protected $total_fee;function __construct($appid, $openid, $mch_id, $key,$out_trade_no,$body,$total_fee) {$this->appid = $appid;$this->openid = $openid;$this->mch_id = $mch_id;$this->key = $key;$this->out_trade_no = $out_trade_no;$this->body = $body;$this->total_fee = $total_fee;}public function pay() {//統一下單接口$return = $this->weixinapp();return $return;}//統一下單接口private function unifiedorder() {$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';$parameters = array('appid' => $this->appid, //小程序ID'mch_id' => $this->mch_id, //商戶號'nonce_str' => $this->createNoncestr(), //隨機字符串 // 'body' => 'test', //商品描述'body' => $this->body, // 'out_trade_no' => '2018013106125348', //商戶訂單號'out_trade_no'=> $this->out_trade_no, // 'total_fee' => floatval(0.01 * 100), //總金額 單位 分'total_fee' => $this->total_fee,'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //終端IP// 'spbill_create_ip' => '192.168.0.161', //終端IP'notify_url' => 'https://www.weixin.qq.com/wxpay/notify.php', //通知地址 確保外網能正常訪問'openid' => $this->openid, //用戶id'trade_type' => 'JSAPI'//交易類型);//統一下單簽名$parameters['sign'] = $this->getSign($parameters);// print_r($parameters);$xmlData = $this->arrayToXml($parameters);$return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));return $return;}private static function postXmlCurl($xml, $url, $second = 30) {$ch = curl_init();//設置超時curl_setopt($ch, CURLOPT_TIMEOUT, $second);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //嚴格校驗//設置headercurl_setopt($ch, CURLOPT_HEADER, FALSE);//要求結果為字符串且輸出到屏幕上curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//post提交方式curl_setopt($ch, CURLOPT_POST, TRUE);curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);curl_setopt($ch, CURLOPT_TIMEOUT, 40);set_time_limit(0);//運行curl$data = curl_exec($ch);//返回結果if ($data) {curl_close($ch);return $data;} else {$error = curl_errno($ch);curl_close($ch);throw new WxPayException("curl出錯,錯誤碼:$error");}}//數組轉換成xmlprivate function arrayToXml($arr) {$xml = "<xml>";foreach ($arr as $key => $val) {if (is_array($val)) {$xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";} else {$xml .= "<" . $key . ">" . $val . "</" . $key . ">";}}$xml .= "</xml>";return $xml;}//xml轉換成數組private function xmlToArray($xml) {//禁止引用外部xml實體 libxml_disable_entity_loader(true);$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);$val = json_decode(json_encode($xmlstring), true);return $val;}//微信小程序接口private function weixinapp() {//統一下單接口$unifiedorder = $this->unifiedorder();// print_r($unifiedorder);$parameters = array('appId' => $this->appid, //小程序ID'timeStamp' => '' . time() . '', //時間戳'nonceStr' => $this->createNoncestr(), //隨機串'package' => 'prepay_id=' . $unifiedorder['prepay_id'], //數據包'signType' => 'MD5'//簽名方式);//簽名$parameters['paySign'] = $this->getSign($parameters);$str = preg_replace('/"(\w+)"(\s*:\s*)/is', '$1$2', $parameters);// print_r($parameters);return $str;}//作用:產生隨機字符串,不長于32位private function createNoncestr($length = 32) {$chars = "abcdefghijklmnopqrstuvwxyz0123456789";$str = "";for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);} return $str; }//作用:生成簽名 private function getSign($Obj) { foreach ($Obj as $k => $v) {$Parameters[$k] = $v;}//簽名步驟一:按字典序排序參數ksort($Parameters);$String = $this->formatBizQueryParaMap($Parameters, false);//簽名步驟二:在string后加入KEY$String = $String . "&key=" . $this->key;//簽名步驟三:MD5加密$String = md5($String);//簽名步驟四:所有字符轉為大寫$result_ = strtoupper($String);return $result_;}///作用:格式化參數,簽名過程需要使用private function formatBizQueryParaMap($paraMap, $urlencode) {$buff = "";ksort($paraMap);foreach ($paraMap as $k => $v) {if ($urlencode) {$v = urlencode($v);}$buff .= $k . "=" . $v . "&";}$reqPar = '';if (strlen($buff) > 0) {$reqPar = substr($buff, 0, strlen($buff) - 1);}return $reqPar;}} ?>回調 URL:notify.php
<?php include "app_config.php"; date_default_timezone_set('PRC'); $str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';echo $str; $times = date("Y-m-d H:i:s",time());//獲取接口數據,如果$_REQUEST拿不到數據,則使用file_get_contents函數獲取$post = $_REQUEST;if ($post == null) {$post = file_get_contents("php://input");}if ($post == null) {$post = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';}if (empty($post) || $post == null || $post == '') {//阻止微信接口反復回調接口 $str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';echo $str;exit('Notify 非法回調');} libxml_disable_entity_loader(true); //禁止引用外部xml實體$xml = simplexml_load_string($post, 'SimpleXMLElement', LIBXML_NOCDATA);//XML轉數組$post_data = (array)$xml;/** 解析出來的數組*Array* (* [appid] => wx1c870c0145984d30* [bank_type] => CFT* [cash_fee] => 100* [fee_type] => CNY* [is_subscribe] => N* [mch_id] => 1297210301* [nonce_str] => gkq1x5fxejqo5lz5eua50gg4c4la18vy* [openid] => olSGW5BBvfep9UhlU40VFIQlcvZ0* [out_trade_no] => fangchan_588796* [result_code] => SUCCESS* [return_code] => SUCCESS* [sign] => F6890323B0A6A3765510D152D9420EAC* [time_end] => 20180626170839* [total_fee] => 100* [trade_type] => JSAPI* [transaction_id] => 4200000134201806265483331660* )**///訂單號$out_trade_no = isset($post_data['out_trade_no']) && !empty($post_data['out_trade_no']) ? $post_data['out_trade_no'] : 0;$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");$txt = "商戶訂單號:".$out_trade_no."\n交易時間:".$post_data['time_end']."\n微信訂單號:".$post_data['transaction_id']."\n訂單金額:".($post_data['total_fee']/100)."$\n用戶ID:".$post_data['openid']."用戶數據:".$post_data['attach'];fwrite($myfile, $txt);fclose($myfile);$dataArray = explode("(LINE)", $post_data['attach']);// 查詢商戶訂單號是否存在,如果存在則進行插入// 若商戶訂單號不存在進行插入$sel_sql = "SELECT * FROM lx_xiasongform WHERE `data_order`='$out_trade_no'";$sel_res = mysql_query($sel_sql);if($sel_res){// 執行成功if(mysql_num_rows($sel_res) > 0){// 訂單號存在,什么都不執行}else{$item01 = $dataArray[0];$item02 = $dataArray[1];$item03 = $dataArray[2];$item04 = $dataArray[3];$item05 = $dataArray[4];$item06 = $dataArray[5];$item07 = $dataArray[6];if(strlen($item01) > 1 && strlen($item02) > 1 && strlen($item03) > 1 && strlen($item04) > 1 && strlen($item05) > 1 && strlen($item06) > 1 && strlen($item07) > 10){$dingdan = $post_data['out_trade_no'];$insert_sql = "INSERT INTO lx_xiasongform (data_lou,data_lou_num,data_kuaidi_type,data_kuaidi_num,data_name,data_phone,data_order,data_time,data_uid) VALUES ('$item01','$item02','$item03','$item04','$item05','$item06','$dingdan','$times','$item07')";mysql_query($insert_sql);mysql_close($con);$str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';echo $str;}}}//阻止微信接口反復回調接口 文檔地址 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_7&index=7,下面這句非常重要!!!$str='<xml>O<return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[K]]></return_msg></xml>'; echo $str;function MakeSign($params,$key){//簽名步驟一:按字典序排序數組參數ksort($params);$string = ToUrlParams($params); //參數進行拼接key=value&k=v//簽名步驟二:在string后加入KEY$string = $string . "&key=".$key;//簽名步驟三:MD5加密$string = md5($string);//簽名步驟四:所有字符轉為大寫$result = strtoupper($string);return $result;}function ToUrlParams( $params ){$string = '';if( !empty($params) ){$array = array();foreach( $params as $key => $value ){$array[] = $key.'='.$value;}$string = implode("&",$array);}return $string; }小程序獲取openid,在app.js根據code獲取openid等信息
//根據code獲取openid等信息wx.login({//獲取codesuccess: function (res) {var code = res.code; //返回codeconsole.log(code);var appId = 'wxae7ccb47501b13a3';var secret = '354ea14b843aa16af18cd81c21da34b1';wx.request({url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appId + '&secret=' + secret + '&js_code=' + code + '&grant_type=authorization_code',data: {},header: {'content-type': 'json'},success: function (res) {console.log(res.data)console.log(res.data.openid)wx.setStorageSync('session', res.data.session_key)wx.setStorageSync('openid', res.data.openid)var openid = res.data.openid //返回openidconsole.log('openid為' + openid);}})}});小程序頁面請求處理:
wx.request({url: app.globalData.requestur3 +'payfee.php', //換成自己的請求地址// url: app.globalData.requestur3 + 'wxpay/Pay.php',data: {id: openid,//獲取用戶 openidfee: money, //價格openid: openid},header: {'Content-Type': 'application/x-www-form-urlencoded'},method: 'post',success: function (res) {var key = '354ea14b843aa16af18cd81c21da34b1';console.log(res.data);console.log('調起支付');wx.requestPayment({'timeStamp': res.data.timeStamp,'nonceStr': res.data.nonceStr,'package': res.data.package,'signType': res.data.signType,'paySign': res.data.paySign,'success': function (res) {console.log('success');wx.showToast({title: '支付成功',icon: 'success',duration: 3000});},'fail': function (res) {console.log(res);},'complete': function (res) {console.log('complete');}});},fail: function (res) {console.log(res.data)}})代碼都是我已經測試好可以支付成功的,希望能幫助到有需要的人~
總結
以上是生活随笔為你收集整理的小程序支付功能签名报错,prepay_id为undefined的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面试题目】2019年中心面试题目记录
- 下一篇: Linux下安装flash player