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”,请检查你的参数接口。

原生支付url参数错误_小程序支付相关推荐

  1. 微信分支付免押租借_小程序版本

    微信支付分免押租借_小程序版本 微信分支付免押租借 小程序版本 微信分支付免押租借 小程序版本 免押租借需要先出UI设计图和微信那边进行对接,然后微信那边给开通服务才可以小程序和后端接口联调 调起方式 ...

  2. python个人微信支付接口_Python实现微信小程序支付功能

    正文 由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 2.获取openid( ...

  3. 微信小程序支付服务器教程,开通微信小程序支付教程

    为减少阅读时间,请先查看以下问题,对照自身情况进行跳转阅读: 1. 是否已有微信支付商户号? 答:①没有    ②有 回答①的用户,请点击[这里]跳转阅读 回答②的用户,请点击[这里]跳转阅读 ①为小 ...

  4. u8 api开发报类型不匹配错误_小程序云开发入门学习,小程序支付功能常见错误汇总及解决方案...

    近期有比较多的同学反映,使用云开发调取微信支付时,老是提示订单不存在.今天就把这几天大家遇到的问题统一汇总到这里. 一,订单不存在的错误 如下图所示的错误. 通常看到这个错误时,最好去看下上面看下,有 ...

  5. 微信小程序 渲染层网络错误_小程序使用video报错 渲染层网络层错误

    我用官方的文档,就换了个图片和视频地址.报错渲染层网络层错误.视频可以看,功能也可以用,但是看到这报错,台烦人了. https://uniapp.dcloud.io/component/cover-v ...

  6. 小程序下单账号与支付账号不一致不让支付_微信小程序支付流程

    微信支付之小程序支付 微信的支付方式有以下几种,不同的支付方式适用于不同的支付场景,而今天要给大家讲的就是 小程序支付 方式 说到支付功能就要涉及到金钱交易,必定是有比较严格的规范及流程,如要求小程序 ...

  7. 微擎支付返回商户单号_微信小程序支付流程

    微信支付之小程序支付 微信的支付方式有以下几种,不同的支付方式适用于不同的支付场景,而今天要给大家讲的就是 小程序支付 方式 说到支付功能就要涉及到金钱交易,必定是有比较严格的规范及流程,如要求小程序 ...

  8. 微信支付,JSAPI支付,APP支付,H5支付,Native支付,小程序支付功能详情以及回调处理

    一.支付相关文档地址 支付wiki:https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml 支付api: https://pay.weixin.qq. ...

  9. 微信支付,小程序支付V3

    简介: 微信支付的文档就不吐槽了,记录下微信支付,小程序支付的实现 开发前准备 账号申请,公钥私钥啥的去官网开发指引-小程序支付 | 微信支付商户平台文档中心 (qq.com) 核心代码 下单及拉起支 ...

最新文章

  1. 企业网站设计方案需先明确网站主题
  2. 编程入门python语言是多大孩子学的-入门编程语言,让你想学Python的几个优点!...
  3. Load 和 DOMContentLoaded 区别
  4. C什么k什么_cssci跟c刊有什么区别
  5. linux tar打包大文件并分割传输另一台linux服务器
  6. 瞬间带你了解如何优化 Mysql 数据库,老板再也不担心客户投诉了
  7. 信息学奥赛一本通 1030:计算球的体积 | OpenJudge NOI 1.3 12
  8. 关于C语言goto的使用
  9. macos 运行linux,MacOS 上运行shell
  10. MYSQL C API风格demo
  11. java获取本机所有可用字体
  12. Rust : ref下的match
  13. c语言 int操作bit,C语言,使用共用体和结构体 查看int型的bit散布
  14. java 动态读取配置文件_java读取配置文件的几种方法
  15. HTML+CSS网页制作——恒德电子
  16. 什么是SDN?用一篇文章彻底讲明白 SDN 软件定义网络是什么!
  17. 随想·手中没有红玫瑰
  18. apache评分表的意义_APACHE-II评分系统表.doc
  19. python 手机自动化_Win10 下python_appium的Android手机自动化环境搭建
  20. 二叉树的后序遍历(递归和非递归)

热门文章

  1. 读取Mc1000的 唯一 ID 机器号
  2. IT团队如何赢得尊重?
  3. 网络安全不是奢侈品,而是必需品
  4. java中单例模式的3种实现
  5. JS中的Replace方法
  6. 华三1822-24路由交换机配置例子
  7. linux无法设置变量,linux – crontab在作业之前无法设置变量
  8. leetcode 123. 买卖股票的最佳时机 III(dp)
  9. leetcode 234. 回文链表(快慢指针+链表倒置)
  10. leetcode97. 交错字符串(动态规划)