控制器:

class Pay extends BaseController
{protected $beforeActionList = ['checkExclusiveScope' => ['only' => 'getPreOrder']];public function getPreOrder($id=''){(new IDMustBePostiveInt()) -> goCheck();$pay= new PayService($id);return $pay->pay();}public function redirectNotify(){$notify = new WxNotify();$notify->handle();}public function notifyConcurrency(){$notify = new WxNotify();$notify->handle();}public function receiveNotify(){$notify = new WxNotify();$notify->handle();}
}

service\Pay:

在引入的微信小程序支付的包的时候,在这里它关联了剩下的包,因此在别的地方需要引入的时候只需要引入第一个包即可。微信小程序官方文档里有。

//需要引入微信小程序的支付的包
//引入微信的API的路径
Loader::import('WxPay.WxPay',EXTEND_PATH,'.Api.php');class Pay
{//支付传递的连个数据private $orderID;private $orderNo;//初始化function __construct($orderID){if (!$orderID){throw new Exception('订单号不允许为空');}$this->orderID = $orderID;}public function pay(){//订单号不存在//订单号存在,但订单和用户不匹配//订单已经被支付//进行库存量检测$this->checkOrderValid();$orderService = new OrderService();$status = $orderService->checkOrderStock($this->orderID);if (!$status['pass']){return $status;}return $this->makeWxPreOrder($status['orderPrice']);}private function makeWxPreOrder($totalPrice){//获取用户的openid$openid = Token::getCurrentTokenVar('openid');if (!$openid){throw new TokenException();}//获取客户端传递的数据$wxOrderData = new \WxPayUnifiedOrder();$wxOrderData->SetOut_trade_no($this->orderNo);$wxOrderData->SetTrade_type('JSAPI');$wxOrderData->SetTotal_fee($totalPrice*100); //单价为分$wxOrderData->setBody('零食商贩');$wxOrderData->SetOpenid($openid);$wxOrderData->SetNotify_url(config('secure.pay_back_url')); // 回调的url
//        $wxOrderData->SetNotify_url('http://qq.com'); // 回调的urlreturn  $this->getPaySignature($wxOrderData);}//获取数字签名private function getPaySignature($wxOrderData){$wxOrder = \WxPayApi::unifiedOrder($wxOrderData);if ($wxOrder['return_code'] != 'SUCCESS' || $wxOrder['result_code'] != 'SUCCESS'){Log::record($wxOrder,'error');Log::record('获取预支付订单失败','error');}$this->recordPreOrder($wxOrder);$signature = $this->sign($wxOrder);return $signature;}//数字签名public function sign($wxOrder){$jsApiPayData = new \WxPayJsApiPay();$jsApiPayData->SetAppid(config('wx.app_id'));$jsApiPayData->SetTimeStamp((string)time());$rand = md5(time() . mt_rand(0,1000));$jsApiPayData->SetNonceStr($rand);$jsApiPayData->SetPackage('prepay_id=' . $wxOrder['prepay_id']);$jsApiPayData->SetSignType('md5');$sign = $jsApiPayData->MakeSign();$rawValues = $jsApiPayData->GetValues();$rawValues['sign'] = $sign;unset($rawValues['appId']);return $rawValues;}//订单记录 更新private function recordPreOrder($wxOrder){OrderModel::where('id','=',$this->orderID)->update(['prepay_id'=>$wxOrder['prepay_id']]);}//验证不存在的订单private function checkOrderValid(){$order = OrderModel::where('id','=',$this->orderID)->find();if (!$order){throw new OrderException();}//存在。验证是否为自己if (!Token::isValidOperate($order->user_id)){throw new TokenException(['msg'=>'订单与用户不匹配','errCode'=>10003]);}//已经支付if ($order->status != OrderStatusEnum::UNPAID){throw new OrderException(['msg'=>'订单已经支付','errCode'=>'80003','code'=>'400']);}$this->orderNo = $order->order_no;return true;}
}

路由:

//支付管理
Route::post('api/:version/pay/pre_order', 'api/:version.Pay/getPreOrder');
//支付回调通知
Route::post('api/:version/pay/notify','api/:version.Pay/receiveNotify');

thinkphp5微信小程序支付的接口详细过程相关推荐

  1. 微信相关-微信小程序支付的实现(详细的一批版)

    微信相关-微信小程序支付的实现 本人只是个半只脚踏进门槛的JAVA后端,以下代码主要是记录我学到的新东西,所以前端需要各位大佬自己去搞了 目录 微信相关-微信小程序支付的实现 一.准备工作(很重要) ...

  2. node微信小程序支付验证

    Node 微信支付验证 说明 业务流程 支付验证 辅助方法 结束 说明 之前写了一个,单纯的微信小程序支付的接口,这篇介绍一下支付完之后如何验证. 业务流程 支付验证 我们之前支付的时候有一个参数 n ...

  3. 微信小程序支付(1)Uni-app平台API接口

    uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.Web(响应式).以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝).快 ...

  4. 关于使用nodejs搭建微信小程序支付接口

    前言 前段时间在开发一个微信小程序的时候需要用到支付功能,我就去看了下微信支付的官方文档,好家伙,微信官方只提供了java.php还有Go语言的sdk.PHP我会点吧,但又不是很会,做为一个菜鸡前端, ...

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

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

  6. 微信小程序支付以及退款功能(超详细)

    Springboot整合微信小程序支付 第一步: 第二步:导入微信支付的依赖 第三步:在springboot核心配置文件中配置参数 第四步:创建配置类WxPayAppConfig 第五步:支付方法 s ...

  7. 微信小程序支付调用官方接口(前端js)

    微信小程序支付(前端) 1.给后端发送请求 2.成功回调判断 3.判断之后调用官方支付接口 4.WXML

  8. 微信小程序支付V3版本接口实现

    一.说明和前期准备(小程序的V3版本) 特别说明:遇到 java.security.InvalidKeyException: Illegal key size ******* getValidator ...

  9. 前端微信一键登录和微信小程序支付总结

    微信一键登录和微信小程序支付总结 微信一键登录 现在小程序都是微信一键登录,下面是我的使用方法和总结,仅供参考 需要调用微信小程序的api wx.login() 使用wx.login() 调用获取凭证 ...

最新文章

  1. python tcp服务器 多线程_Python中的多线程TCP服务器
  2. 学习笔记:UINavigationbar的背景修改方法集合
  3. 记下来 Spring 装配 Bean 的三种方式
  4. cdev_alloc和cdev_init 的使用
  5. 一轮项目冲刺——移山小分队(6)
  6. 《SpringCloud超级入门》Spring Cloud Eureka是什么?《八》
  7. 记录使用IDEA部署Tomcat时提示错误:the selected directory is not a TomEE home
  8. SQLite大漏洞!所有Chromium浏览器中招,安卓iOS应用也受殃及
  9. html5 history解决ajax不能加入历史记录的问题
  10. 国外软件测试方法,ATE软件测试方法研究及实现
  11. 属性绑定v-bind指令
  12. 官网下载STM32系列芯片的产品选型手册
  13. oracle 经纬度格式转换,GOOGLE与百度经纬度互转(plsql版)
  14. 「网络安全」将会是下一个风口?这个“下饭神剧”值得一看!
  15. 如何解决Windows10系统空闲时间CPU占用高,风扇很响的问题?
  16. Oracle日期类型转long类型
  17. 安全生产六步法是什么_安全生产六步法
  18. airtest--自动刷喵币
  19. 计算机专业如何谋生自己谋生,如何谋生
  20. uniapp中使用canvas生成海报

热门文章

  1. 配置Fairseq的wav2ec采坑日志3:编译安装flashlgiht
  2. python中统计次数的方法(出现次数、总数)
  3. php数字大写,php数字大写转换的方法
  4. Cannot write part arg0. RPC/Literal parts cannot be null
  5. c语言里怎么输入三角函数,c语言编程中的三角函数怎么输入?
  6. imagick的简单使用
  7. HttpServletResponse.sendRedirect和RequestDispatcher.foward的区别(重定向与转发)
  8. 内推 | 【唯品会-数据分析】成都 10-15K
  9. PS菜鸟入门 -- 工具用法
  10. KBEngine demo搭建简介