原生支付url參數錯誤_小程序支付

4fbb6df4ad4a323fb802b5fb2dfa6037.png
  1. 下載微信JSAPI支付的 SDK : https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php.zip ;解壓后放在extend 文件夾下,命名為wepay
  2. 下載你的商戶證書,放在extend/wepay/cert/ 文件夾下面。自行將 extend/wepay/example/WxPay.Config.php 的appId , mch_id, key(商戶支付秘鑰),appsecret ,證書路徑 設置好。
  3. 創建新的驗證控制器WechatPayNotify.php,復制下面代碼進去,在最后的TODO3 那里,可以插入你在訂單支付后的相關代碼。比如數據庫訂單狀態更新
use thinkfacadeCache;
require_once "../extend/wepay/lib/WxPay.Api.php";
require_once "../extend/wepay/lib/WxPay.Exception.php";
require_once "../extend/wepay/lib/WxPay.Config.Interface.php";
require_once "../extend/wepay/lib/WxPay.Data.php";
require_once "../extend/wepay/example/WxPay.JsApiPay.php";
require_once "../extend/wepay/example/WxPay.NativePay.php";
require_once '../extend/wepay/lib/WxPay.Notify.php';
require_once "../extend/wepay/example/WxPay.Config.php";class WechatPayNotify extends WxPayNotify
{public function index(){$config = new WxPayConfig();$this->Handle($config, false);}//查詢訂單public function Queryorder($transaction_id,$data=[]){$input = new WxPayOrderQuery();$input->SetTransaction_id($transaction_id);$config = new WxPayConfig();$result = WxPayApi::orderQuery($config, $input,$data);if(array_key_exists("return_code", $result)&& array_key_exists("result_code", $result)&& $result["return_code"] == "SUCCESS"&& $result["result_code"] == "SUCCESS"){return true;}return false;}/**** 回包前的回調方法* 業務可以繼承該方法,打印日志方便定位* @param string $xmlData 返回的xml參數***/public function LogAfterProcess($xmlData){
//        Log::DEBUG("call back, return xml:" . $xmlData);return;}//重寫回調處理函數/*** @param WxPayNotifyResults $data 回調解釋出的參數* @param WxPayConfigInterface $config* @param string $msg 如果回調處理失敗,可以將錯誤信息輸出到該方法* @return true回調出來完成不需要繼續回調,false回調處理未完成需要繼續回調*/public function NotifyProcess($objData, $config, &$msg){$data = $objData->GetValues();//TODO 1、進行參數校驗if(!array_key_exists("return_code", $data)||(array_key_exists("return_code", $data) && $data['return_code'] != "SUCCESS")) {//TODO失敗,不是支付成功的通知//如果有需要可以做失敗時候的一些清理處理,并且做一些監控$msg = "異常異常";Cache::set('wx_pay_error_msg',$msg,3600);return false;}if(!array_key_exists("transaction_id", $data)){$msg = "輸入參數不正確";Cache::set('wx_pay_error_msg',$msg,3600);return false;}//TODO 2、進行簽名驗證try {$checkResult = $objData->CheckSign($config);if($checkResult == false){Cache::set('wx_pay_error_msg','簽名錯誤',3600);//簽名錯誤
//                Log::ERROR("簽名錯誤...");return false;}} catch(Exception $e) {
//            Log::ERROR(json_encode($e));}//查詢訂單,判斷訂單真實性if(!$this->Queryorder($data["transaction_id"],$data)){$msg = "訂單查詢失敗";Cache::set('wx_pay_error_msg','訂單錯誤',3600);return false;}//TODO 3、處理業務邏輯//這里是支付后的操作處理return true;}}
  1. 后臺獲取小程序幾個支付參數的具體代碼:
public function get_data(){//獲取支付參數require_once "../extend/wepay/lib/WxPay.Api.php";require_once "../extend/wepay/lib/WxPay.Exception.php";require_once "../extend/wepay/lib/WxPay.Config.Interface.php";require_once "../extend/wepay/lib/WxPay.Data.php";require_once "../extend/wepay/example/WxPay.JsApiPay.php";require_once "../extend/wepay/example/WxPay.NativePay.php";require_once '../extend/wepay/lib/WxPay.Notify.php';require_once "../extend/wepay/example/WxPay.Config.php";$nodify_url = url('WechatPayNotify/index','','',true);//跳轉到你的驗證地址//①、獲取用戶openid$tools = new JsApiPay();$openId = input('open_id');//小程序的用戶openId$out_trade_no = input('oid');//你的訂單號$price = 0.01;$account = $price*100;//訂單價格*100 ,單位:分try{//②、統一下單$input = new WxPayUnifiedOrder();$input->SetBody('testbox');//商品描述$input->SetAttach('testdev');//附加數據參數$input->SetSignType("MD5");//設置簽名加密方式$input->SetOut_trade_no($out_trade_no);$input->SetTotal_fee($account);//訂單金額,單位:分$input->SetTime_start(date("YmdHis"));$input->SetTime_expire(date("YmdHis", time() + 600));
//                $input->SetGoods_tag("test");$input->SetNotify_url($nodify_url);$input->SetTrade_type("JSAPI");$input->SetOpenid($openId);$config = new WxPayConfig();$order = WxPayApi::unifiedOrder($config, $input);$temp = $order;
//            print_r($temp);$key = $config->GetKey();//商戶支付秘鑰,不是AppSecret$app_id = $config->GetAppId();} catch(Exception $e) {
//                print_r($e);$this->error('出錯');}//小程序二次簽名獲取,MD5加密方式$timeStamp = ''.time().'';$nonceStr = $temp["nonce_str"];// 隨機字符串,32位以內,隨意$package = "prepay_id=".$temp["prepay_id"];//統一下單的prepay_id,格式是prepay_id = ....$string = "appId=".$app_id."&nonceStr=".$nonceStr."&package=".$package."&signType=MD5&timeStamp=".$timeStamp."&key=".$key;// 參數排序就是字典序,嚴格注意大小寫$paySign = strtoupper(md5($string));$assign = ['error' => 0,'openid' => $openId,'appId' => $app_id,'timeStamp' => $timeStamp,'nonceStr' => $nonceStr,'package' => $temp["prepay_id"],'paySign' => (string)$paySign,];return json_encode($assign);}

至此,微信小程序支付參數獲取完成。只需要在前端調用參數接口即可。

易出錯的幾個地方:

1. 統一下單 和 小程序二次簽名使用的appId 都是小程序的appId

2. 簽名方式:統一下單和 小程序二次簽名使用的簽名方式,保持一致。這里我用的是MD5

3.請確保商戶支付秘鑰的正確性,這里的key 是商戶支付秘鑰,不是appsecret

4.簽名驗證格式:請注意參數大小寫,嚴格按照上方例子的格式來:

$string = "appId=".$app_id."&nonceStr=".$nonceStr."&package=".$package."&signType=MD5&timeStamp=".$timeStamp."&key=".$key;

可以使用簽名驗證工具驗證:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1

5.如果上方步驟全部正確,但仍報“支付驗證簽名失敗”,請檢查你的前端格式,先把參數接口獲取到的數據用var 定義,再放到支付請求接口。(這個巨坑)

6.若提示“缺乏total_fee”,請檢查你的參數接口。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394156.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394156.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394156.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android清理設備內存具體完整演示樣例(二)

版權聲明: https://blog.csdn.net/lfdfhl/article/details/27672913 MainActivity例如以下: package cc.c;import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.List; import android.app.Activity; import a…

java圖片合成視頻_使用JAVACV把圖片合成視頻

使用JAVACV1.2把圖片合成視頻,直接上代碼。自己mark一下,也希望能夠幫助更多的人。package test;import static org.bytedeco.javacpp.opencv_imgcodecs.cvLoadImage;import java.io.File;import org.bytedeco.javacpp.avcodec;import org.bytedeco.java…

NPOI導出Excel

首先在官網去下載NPOI&#xff0c;把dll引用到項目中&#xff0c;然后獲取列表調用下面的方法就可以導出 后臺代碼&#xff1a; /// <summary> /// NPOI導出Excel /// </summary> /// <param name"dt"></param> /// <param name"fil…

leetcode1028. 從先序遍歷還原二叉樹(dfs/棧)

我們從二叉樹的根節點 root 開始進行深度優先搜索。 在遍歷中的每個節點處&#xff0c;我們輸出 D 條短劃線&#xff08;其中 D 是該節點的深度&#xff09;&#xff0c;然后輸出該節點的值。&#xff08;如果節點的深度為 D&#xff0c;則其直接子節點的深度為 D 1。根節點的…

react jest測試_如何使用Jest和react-testing-library測試Socket.io-client應用程序

react jest測試by Justice Mba由Mba法官 如何使用Jest和react-testing-library測試Socket.io-client應用程序 (How to test a Socket.io-client app using Jest and the react-testing-library) Testing the quality of real-time Socket.io-client integration seems to have…

統計學會用到python嗎_統計學學的統計軟件深嗎(例如Python)普通一本統計學大一不知道該干什么?...

統計學的話&#xff0c;不考慮把基礎課和專業課好好學一學嘛&#xff5e; 大一的話數分高代幾何已經占了很長時間啦&#xff0c;多刷刷題&#xff0c;把績點和排名搞得高一點是重中之重嘛&#xff5e;再說學習語言的事兒&#xff5e; 要說日常使用&#xff0c;那還是更推薦pyth…

枚舉轉中文,通過反射方法與描述的方式獲取

示例&#xff1a; 有人為了顯示中文&#xff0c;這樣定義枚舉嗎&#xff1f; publicenum TimeOfDay { 上午, 下午, 晚上 }; 這樣定義&#xff0c;很別扭&#xff0c;特別是在使用的時候&#xff0c; 比如&#xff0c;this.Time TimeOfDay.上午; 而…

Java語言最新實用案例教程_Java 語言實用案例教程

基本信息書名:Java 語言實用案例教程出版價格&#xff1a;48元作者:常玉慧, 王秀梅出版社&#xff1a;科學出版社出版日期&#xff1a;2016-10-1ISBN&#xff1a;9787030497383字數&#xff1a;387000頁碼&#xff1a;235版次&#xff1a;版裝幀&#xff1a;平裝開本&#xff1…

(轉)Java隨機數

1 隨機數的三種產生方式 本章先講解Java隨機數的幾種產生方式&#xff0c;然后通過示例對其進行演示。 廣義上講&#xff0c;Java中的隨機數的有三種產生方式&#xff1a; (01). 通過System.currentTimeMillis()來獲取一個當前時間毫秒數的long型數字。(02). 通過Math.random()…

leetcode105. 從前序與中序遍歷序列構造二叉樹(遞歸)

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意: 你可以假設樹中沒有重復的元素。例如&#xff0c;給出前序遍歷 preorder [3,9,20,15,7] 中序遍歷 inorder [9,3,15,20,7] 返回如下的二叉樹&#xff1a;3/ \9 20/ \15 7代碼 /*** Definition for a binary tree node.*…

途虎養車三個創始人_3個來自非常規創始人的獲獎技術和產品見解

途虎養車三個創始人by Henry通過亨利 3個來自非常規創始人的獲獎技術和產品見解 (3 Winning Technology & Product Insights from WeChat’s unconventional founder) Intro: The writer is a current PMLinkedIn. Formerly he worked as a growth engineer Facebook. he …

Powershell-創建Module

1.找到默認module路徑&#xff0c;ISE啟動時自動加載默認領下的Module代碼。 $env:PSModulePath 2.在其中一個默認路徑下創建個文件夾&#xff0c;在文件夾下創建一個.psm1后綴文件&#xff0c;注意文件夾名字與文件名一樣。 3.在.psm1文件中寫入函數代碼。 4.重啟ISE自動加載m…

android是java_為什么大家都用JAVA寫android程序

您好&#xff0c;1、原始類型&#xff1a;v void 只能用于返回值類型Z booleanB byteS shortC charI intJ long(64位)F floatD double(64位)對象類型&#xff1a;Lpackage/name/ObjectName相當于java中的package.name.ObjectName解釋如下&#xff1a;L&#xff1a;表示這是一個…

preserve log什么意思_一些有意思的JavaScript代碼片段

Javascript是一門很靈活的語言&#xff0c;我們可以使用它動態地實現各種各樣的功能。但是動態帶來便利的同時&#xff0c;也存在一些令人費解的行為&#xff0c;稍不注意就會進入誤區一個接著一個的坑。雖然我使用JavaScript的時間還不算長&#xff0c;也是遇到了一些有意思的…

快速排序——Java

快排的思想想必大家都懂&#xff0c;前后兩個指針&#xff0c;向中間靠攏。我這個partition函數能保證所有相同的數都被比較一次&#xff0c;靠攏在一起。 代碼&#xff1a; public class Main { public static int[] partition1(int[] arr, int begin, int end, int pivotVal…

預處理器sass_Sass — Web的預處理器裝飾

預處理器sass美學的重要性&#xff0c;其影響以及實現這一目標的工具。 (Importance of aesthetics, its impact, and tool to achieve it.) I remember as a child, every time I’d walk up to a bakery, I’d choose the pastries with the most beautiful toppings. Only a…

leetcode971. 翻轉二叉樹以匹配先序遍歷(dfs)

給定一個有 N 個節點的二叉樹&#xff0c;每個節點都有一個不同于其他節點且處于 {1, …, N} 中的值。 通過交換節點的左子節點和右子節點&#xff0c;可以翻轉該二叉樹中的節點。 考慮從根節點開始的先序遍歷報告的 N 值序列。將這一 N 值序列稱為樹的行程。 &#xff08;回…

【BZOJ3932】[CQOI2015]任務查詢系統 主席樹

【BZOJ3932】[CQOI2015]任務查詢系統 Description 最近實驗室正在為其管理的超級計算機編制一套任務管理系統&#xff0c;而你被安排完成其中的查詢部分。超級計算機中的任務用三元組(Si,Ei,Pi)描述&#xff0c;(Si,Ei,Pi)表示任務從第Si秒開始&#xff0c;在第Ei秒后結束&…

沖刺第一天

任務板 未開始 進行中已完成 劉曉杰&#xff1a;找回密碼界面 頁面風格優化 劉曉杰&#xff1a;滑動歡迎界面/加載界面 預計時間&#xff1a;5.5h 馮晨&#xff1a;找回密碼功能 發布動態界面 馮晨&#xff…

杭電1003 java_杭電ACM1003題怎么理解?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓http://acm.hdu.edu.cn/showproblem.php?pid1003Max SumTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 99208 Accepted Submission(s): 22835Problem DescriptionGiven…