首先下载微信支付SDK ,将整个目录的文件放在 /application/extend/WxPay 目录下

在使用SDK之前我们需要对 WxPay.Config.php 进行配置

namespace app\api\service;

use app\api\model\Order as OrderModel;

use app\lib\exception\OrderException;

use app\lib\exception\TokenException;

use think\Exception;

use think\Loader;

use think\Log;

require_once '/extend/WxPay/WxPay.Api.php';

class Pay

{

private $orderNo;

private $orderID;

//实例化时传入订单ID 此ID由第三方服务器自己定义

function __construct($orderID)

{

if (!$orderID)

{

throw new Exception('订单号不允许为NULL');

}

$this->orderID = $orderID;

}

public function pay()

{

// 根据订单ID 查到订单下对应商品

// 对商品库存检测等操作

// Todo ...

return $this->makeWxPreOrder($status['orderPrice']);

}

// 构建微信支付订单信息

private function makeWxPreOrder($totalPrice)

{

//获得当前用户 openid

$openid = Token::getCurrentTokenVar('openid');

if (!$openid)

{

throw new TokenException();

}

//创建订单信息

$wxOrderData = new \WxPayUnifiedOrder(); //需要引入微信提供的SDK

$wxOrderData->SetOut_trade_no($this->orderNo); //订单编号,第三方自定义

$wxOrderData->SetTrade_type('JSAPI'); //交易类型,一般是JSAPI

$wxOrderData->SetTotal_fee($totalPrice * 100); //设置总金额,单位为0.01元

$wxOrderData->SetBody('零食商贩'); //设置展示信息

$wxOrderData->SetOpenid($openid); //openid

$wxOrderData->SetNotify_url(config('wx.pay_back_url')); //回调地址

return $this->getPaySignature($wxOrderData);

}

/**

* 向微信请求订单号并生成签名

*/

private function getPaySignature($wxOrderData)

{

$wxOrder = \WxPayApi::unifiedOrder($wxOrderData);

//返回结果中包含 prepay_id ,此ID作为用户拉起支付时凭证,

//同时此ID作为将来服务器向客户端推送消息的标识,因此需要保存在数据库订单表中

// 失败时不会返回result_code

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;

}

private function recordPreOrder($wxOrder){

// 将 prepay_id 保存在数据库中

OrderModel::where('id', '=', $this->orderID)

->update(['prepay_id' => $wxOrder['prepay_id']]);

}

/**

* 签名

* @return [array] [返回数组中要包含小程序发起支付请求的所有参数 包含:小程序ID、时间戳、随机串、数据包(prepay_id)、签名方式、签名 6个参数]

*

*/

private function sign($wxOrder)

{

//调用SDK 生成签名

$jsApiPayData = new \WxPayJsApiPay();

//Appid

$jsApiPayData->SetAppid(config('wx.app_id'));

//timeStamp

$jsApiPayData->SetTimeStamp((string)time());

//nonceStr

$rand = md5(time() . mt_rand(0, 1000));

$jsApiPayData->SetNonceStr($rand);

//package

$jsApiPayData->SetPackage('prepay_id=' . $wxOrder['prepay_id']);

//signType

$jsApiPayData->SetSignType('md5');

//生成签名

$sign = $jsApiPayData->MakeSign();

//获取数组

$rawValues = $jsApiPayData->GetValues();

$rawValues['paySign'] = $sign;

return $rawValues;

}

}

接着在控制器中调用该类下的 pay 方法 ,并创建回调函数

当用户支付完成后,微信服务器会以POST请求到指定回调地址,改地址微信服务器会默认屏蔽掉?后面字符串部分,数据通过XML形式放在body中,格式:

  //这个是我们服务器向微信服务器发送的订单号,该订单号由我们自己生成,根据该订单号可以做相应的业务

        //支付结果

1

第一种方法我们可以自己解析这个XML 然后获得需要的数据

第二种方法我们可以通过重写微信SDK中 WxPay.Notify.php 中 NotifyProcess 方法来处理这个数据

该方法两个参数,第一个参数就是服务器返回的XML数组化后的值()

我们可以重写该类

require_once '/application/extend/WxPay/WxPay.Notify.php';

class WxNotify extends \WxPayNotify

{

public function NotifyProcess($data, &$msg)

{

if ($data['result_code'] == 'SUCCESS') {

$orderNo = $data['out_trade_no'];

//开启事务,避免因服务器阻塞,微信多个请求同时到达,出现重复执行业务代码

Db::startTrans();

try {

$order = Order::where('order_no', '=', $orderNo)->lock(true)->find();

//如果订单处于未支付状态下才执行里面的业务代码

if ($order->status == 1) {

//查库存

//改支付状态

//减库存

}

Db::commit();

} catch (Exception $ex) {

Db::rollback();

Log::error($ex);

// 如果出现异常,向微信返回false,请求重新发送通知

return false;

}

}

//如果处理成功,需要向微信服务器发送 TRUE, 告诉微信停止请求回调地址

return true;

}

}

在控制器的回调函数中调用该子类

注意:不能直接调用 NotifyProcess 方法,因为我们无法传递该方法的参数,该参数是由父类中方法生成,需要调用父类中 handle 方法来执行 NotifyProcess 中代码

public function receiveNotify()

{

$notify = new WxNotify();

$notify->handle();

}

微信小程序支付功能 C# .NET开发

微信小程序支付功能的开发的时候坑比较多,不过对于钱的事谨慎也是好事.网上关于小程序支付的实例很多,但是大多多少有些问题,C#开发的更少.此篇文档的目的是讲开发过程中遇到的问题做一个备注,也方便其他开发 ...

微信小程序支付功能前端流程

只是分享一下小程序支付功能的前端流程和代码, 仅供参考(使用的是uni app). handleCreate () { /** 第一步:前台将商品数据发送到后台,后台创建订单入库并返回订单id等信息 ...

微信小程序支付功能讲解(1)

前言:虽然小程序做过很多,但是一直觉得微信支付功能很是神秘,现在终于有机会接触心里还是有点小激动的,经过一番折腾发现支付也不过如此,在此记录下支付功能的实现过程 小程序的官方文档介绍到发起微信支付即调 ...

微信小程序支付功能讲解(2)

小程序支付 业务流程时序图 官方文档 步骤: 1. Openid 在小程序初次加载的时候就已经获取(详情见 小程序登录) 2. 生成商户订单 1.商品信息由小程序端提供 2.提供支付统一下单接口所需参 ...

微信小程序支付功能讲解

前言:虽然小程序做过很多,但是一直觉得微信支付功能很是神秘,现在终于有机会接触心里还是有点小激动的,经过一番折腾发现支付也不过如此,在此记录下支付功能的实现过程 小程序的官方文档介绍到发起微信支付即调 ...

微信小程序 支付功能(前端)的实现

只提供微信小程序端代码: var app = getApp(); Page({ data: {}, onLoad: function (options) { // 页面初始化 options为页面跳转 ...

Python实现微信小程序支付功能

由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 当然具体的参数配置可以参考官 ...

微信小程序支付功能完整流程

支付流程 整个支付流程分为四个步骤: 获取令牌token 创建订单 预支付,获取支付参数对象pay 发起微信支付 收尾工作.跳转到订单页面,删除购物车中已购买的商品 请求方式:POST 整个支付过程中 ...

微信小程序支付功能

API:wx.requestPayment() { } https://blog.csdn.net/qishubiao/article/details/80804052

随机推荐

angularjs 弹出框 $modal 参数(转)

angularjs 弹出框 $modal   $modal只有一个方法:open,该方法的属性有: templateUrl:模态窗口的地址 template:用于显示html标签 scope:一个作用 ...

Oracle 数据库基础学习 (六) 子查询

子查询在一个select中出现多个嵌套查询语句 1.在where子句中使用子查询(一般返回"单行单列" "单行多列" "多行单列"(可以提供 ...

wxPython:事件

事件──── 是每个 GUI 应用不可舍割的一部分,因为所有的 GUI 应用程序都是基于事件驱动的.从 GUI 程序启动开始,它就回应同户的不同类型的事件.除了用户,也有其它因素可以产生事件,例如:互 ...

Postfix之telnet测试

1.# 2. 3.#若没安装telnet 需安装telnet 4.yum install telnet 5. 6.#telnet测试smtp连接postfix 7.telnet 127.0.0.1 2 ...

在虚拟环境中安装pygame

http://www.pygame.org/wiki/CompileUbuntu#Python%203.x%20into%20virtual%20environment 先安装依赖: ᐅ sudo a ...

qt tablewidget搜索效果如下

from PyQt4.QtCore import *from PyQt4.QtGui import *from PyQt4.Qt import *import sysfrom aa1 import U ...

第七个问题(枚举和set)

set添加元素是基于equals和hashCode函数来确定的两个要素是否是同一物体. public final boolean equals(Object other) 当指定对象等于此枚举常量时, ...

再谈Java方法传参那些事

把一个变量带进一个方法,该方法执行结束后,它的值有时会改变,有时不会改变.一开始会觉得--“好神奇呀”.当我们了解java内存分析的知识后,一切都是那么简单明了了--“哦,这么回事呀”.但是今天的上机 ...

Swift开发常用知识点

#pragma mark - as/类型转换as? / as! 需要根据前面的返回值决定 有?证明可选,可能为空:需要弱解包 没有?证明一定有值:大胆解包 as? 前面的结果是可选的 if let / ...

hdu4578 线段树 三次方,二次方,一次方的值

Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, -, a n. The initial val ...

微信小程序支付功能用服务器吗,微信小程序 支付功能 服务器端(TP5.1)实现...相关推荐

  1. 微信小程序直播自己的服务器,使用微信小程序和腾讯云实现直播功能

    不久前微信小程序开放了直播接口,正好阿北的服务器在腾讯云上,就用腾讯云的直播服务实战了一下,以下为实战过程,希望对你有用. 我是通过obs实现推流,然后用小程序进行直播播放,也就是PC->小程序 ...

  2. 微信小程序订餐系统需要服务器吗,微信小程序订餐系统怎么开发 怎么创建微信外卖小程序...

    原标题:微信小程序订餐系统怎么开发 怎么创建微信外卖小程序 过硬(10guoying.com)6月4日 观察:网上订餐的新消费方式如今在我们日常生活中已经十分常见,人们不仅可以在饿了么.美团等的外卖平 ...

  3. 企业微信一聊天连不上服务器,企业微信_访问频率限制

    访问频率限制 当你获取到AccessToken时,你的应用就可以成功调用企业微信后台所提供的各种接口以管理或访问企业微信后台的资源或给企业微信成员发消息. 为了防止企业应用的程序错误而引发企业微信服务 ...

  4. 微信加不了公众号服务器繁忙,微信公众号系统繁忙是怎么回事

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 微信公众号系统繁忙的原因如下: 1.可能由于网络不稳定导致,解决方法:建议更换其他网络或使用wifi网络登录使用. 2.可能公众号 ...

  5. 小森生活一直显示服务器连接异常,小森生活进不去怎么解决?无法进入游戏问题原因与解决办法[多图]...

    小森生活进不去怎么解决?最近许多玩家反应,在登录小森生活时无法正常进入游戏,有的崩溃,有的闪退,有的直接系统提示无法进入,盒子小编来告诉大家解决办法. 小森生活进不去解决攻略 一.检查小森生活安装包 ...

  6. 微信小程序口袋奇兵选服务器,口袋奇兵小程序

    口袋奇兵小程序是一款精彩好玩的特色策略建造小游戏,玩家们需要在全新的世界中打造自己的军队,口袋奇兵小程序无需下载在线就可以排列你的建造阵容和冒险模式,点击各种互动玩法开始新的休闲策略体验,和你的朋友在 ...

  7. 小程序背景图片从服务器获取,微信小程序button控件去边框、加背景图

    button边框去除 相信大家开发微信小程序时使用button会遇到一些与预期效果不同的样式问题.例如button的边框无法去除,在为button设置圆角的时候周围会有一些"杂质" ...

  8. 微信小视频会上传到服务器么,微信新出的视频号功能怎么样发布短视频?能上传一分钟以上吗?...

    也许有人会说微信视频号上现在太多专业人士输出的内容,对于一般人来讲机会渺茫,这种说法不符合微信发展视频号的初心,人人都有自己的品牌,就跟公众号一样,视频号还是希望更多普通用户参与创作的,只要内容优质, ...

  9. 微信收款音响s2怎么连接服务器失败,微信收款音响s1和s2有什么区别

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 微信收款音响s1和s2的区别就是S2声音大,很明显超过S1很多,还有S2底盘小,不如S1稳当,两款音响里面都内置物联网卡,S1和S ...

最新文章

  1. quot;愿有人陪你颠沛流离|Be With Youquot;
  2. Redux 核心概念
  3. 题解 T28305 【yizimi的旅游景点】
  4. 「Python基础知识」Python中常用的内建函数有哪些
  5. 团队作业——微博网站小调查
  6. 轻松搞定C语言中复杂的声明
  7. 电视机魔百盒显示连接服务器失败,【当贝市场】魔百盒EPG主页加载不出来办法详解...
  8. VBS基础教程(收藏)
  9. ceentos7修改成中文界面
  10. 表格排版及其表格嵌套
  11. Oracle EBS使用adpatch工具打patch过程 hotpatch mode
  12. cao方法matlab程序,偏最小二乘法 matlab程序 [转]
  13. 领航机器人广告段子_医院机器人物流广告词
  14. GRV – 可视化git仓库工具
  15. 华为--dis查看命令
  16. 字符编码OneHotEncoder
  17. 一个机械专业小混混 gooogleman 学习嵌入式ARM的真实经历
  18. 经济危机,其实机会大于危险
  19. (实战)[re:Invent 2018]-002:通过分析奖励函数优化后- 8.4s / 圈
  20. golang 踩坑:xml解析问题,chanel使用问题

热门文章

  1. 2021年高考防骗预警,6大骗局,防骗指南,考生、家长请注意
  2. python入门2——基础语法2——字符串详解
  3. CCS10.2入门(一)
  4. 夜游项目如何挖掘景区独具特色文化
  5. RAM与ROM与CMOS
  6. 6把椅子换位思考法则
  7. 如何查询网站服务器供应商,查询网站服务器提供商
  8. 汪峰演唱会的线上营销和线下营销
  9. 合振动的初相位推导_如何确定合振动的初相位
  10. 内网渗透-msf及socks代理转发