原生支付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.mzph.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…