Codeigniter中创建LeanCloud云函数实现微信支付

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

经过摸索,与官方提供的slim无异,同样使用__invoke魔法函数即可,步骤如下:

1.config.php打开hook,即设置$config['enable_hooks'] = TRUE;

详情文档参见:http://codeigniter.org.cn/user_guide/general/hooks.html

2.在hook.php中实现

<?phprequire_once __DIR__ . '/../third_party/wxpay/WxPay.Api.php';use \LeanCloud\Engine\LeanEngine;
use \LeanCloud\Engine\Cloud;
use \LeanCloud\Client;
use \LeanCloud\Storage\CookieStorage;
/** Define cloud functions and hooks on LeanCloud*/// /1.1/functions/sayHello
Cloud::define("pay", function($params, $user) {// var_dump($user);$openid = $user->get('authData')["lc_weapp"]["openid"];// 		初始化值对象$input = new WxPayUnifiedOrder();// 		文档提及的参数规范:商家名称-销售商品类目$input->SetBody($params['body']);// 		订单号应该是由小程序端传给服务端的,在用户下单时即生成,demo中取值是一个生成的时间戳$input->SetOut_trade_no($params['tradeNo']);// 		费用应该是由小程序端传给服务端的,在用户下单时告知服务端应付金额,demo中取值是1,即1分钱$input->SetTotal_fee($params['totalFee']);$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");$input->SetTrade_type("JSAPI");// 		由小程序端传给服务端$input->SetOpenid($openid);// 		向微信统一下单,并返回order,它是一个array数组$order = WxPayApi::unifiedOrder($input);// 		json化返回给小程序端header("Content-Type: application/json");return getJsApiParameters($order);// return "hello {$params['name']}";
});function getJsApiParameters($UnifiedOrderResult) {if(!array_key_exists("appid", $UnifiedOrderResult)|| !array_key_exists("prepay_id", $UnifiedOrderResult)|| $UnifiedOrderResult['prepay_id'] == ""){throw new WxPayException("参数错误");}$jsapi = new WxPayJsApiPay();$jsapi->SetAppid($UnifiedOrderResult["appid"]);$timeStamp = time();$jsapi->SetTimeStamp("$timeStamp");$jsapi->SetNonceStr(WxPayApi::getNonceStr());$jsapi->SetPackage("prepay_id=" . $UnifiedOrderResult['prepay_id']);$jsapi->SetSignType("MD5");$jsapi->SetPaySign($jsapi->MakeSign());$parameters = json_encode($jsapi->GetValues());return $parameters;
}class CIEngine extends LeanEngine {function __invoke() {$this->dispatch($_SERVER['REQUEST_METHOD'],$_SERVER['REQUEST_URI']);}
}$hook['pre_system'] = function() {// 参数依次为 AppId, AppKey, MasterKeyClient::initialize("SgHcsYqoLaFTG0XDMD3Gtm0I-**", "xdv2nwj**glFoFXkQcxP" ,"v3P5xzDa0b5***0xX0biHpT");Client::useMasterKey(true);Client::setStorage(new CookieStorage());$engine = new CIEngine();// 以下是核心语句,直接像使用函数那样在对象上调用$engine();
};

3.最后,在小程序端调用云函数

AV.Cloud.run('pay', paramsJson).then(function(response) {response = JSON.parse(response);// 调用成功,得到成功的应答 dataconsole.log(response);// 发起支付wx.requestPayment({'timeStamp': response.timeStamp,'nonceStr': response.nonceStr,'package': response.package,'signType': 'MD5','paySign': response.paySign,'success':function(res){wx.showToast({title: '支付成功'});// update order,此处是不良示范,应该通过上述SetNotify_url回调通知里在服务端更新订单状态var query = new AV.Query('Order');query.get(that.data.orderId).then(function (order) {order.set('status', 1);order.save();console.log('status: ' + 1);}, function (err) {});}});
}, function(err) {// 处理调用失败console.log(err);
});

这里有一个坑,就是服务端发来的数据是纯文本,而不是json对象,哪怕是调了header函数,header("Content-Type: application/json");还是一样,所以要强转一下。

response = JSON.parse(response);

而之前的做法,要先在小程序中调用wx.login,请拿appid/appsecret获取openId,最后wx.request请求统一下单url。现在的做法要简单多的,小程序端就不关心https://lendoo.leanapp.cn这个地址是何物了,直接跑AV.Cloud.run()就可以了。

4. 完善微信支付回调通知

由服务端发起回调更新订单的状态才是正确的打开方式,于是在WXPay.php文件增加notify方法,供微信侧回调用

public function notify() {//获取通知的数据$xml = $GLOBALS['HTTP_RAW_POST_DATA'];//如果返回成功则验证签名$result = WxPayResults::Init($xml);$notify = new PayNotifyCallBack();$notify->Handle(false);$returnValues = $notify->GetValues(); //交易成功if(!empty($returnValues['return_code']) && $returnValues['return_code'] == 'SUCCESS'){  //商户逻辑处理,如订单状态更新为已支付  $out_trade_no = $result['out_trade_no'];// 通过订单id,将它改为已支付状态$order = Object::create('Order', $out_trade_no);$order->set('status', 1);$order->save();}              echo $notify->ToXml();//返回给微信确认 
}

其中PayNotifyCallBack类,在微信提供的php sdk包已经提供,我只是改了文件名,原包名为notify.php

微信php sdk的下载地址是:https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip

相应地,在统一下单的配置参数中,换上真实的回调地址,即将上述$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");更正为$input->SetNotify_url("https://lendoo.leanapp.cn/WXPay/notify");

这样一来,微信支付那头就是隔段时间发通知过来,直到处理成功为止;如果终止不能成功,微信端才会放弃。 源码下载:http://git.oschina.net/dotton/lendoo-wx,本文涉及代码存于/pages/order/payment文件夹中;相应后端代码托管在:http://git.oschina.net/dotton/lendoo-web,代码存于config/hooks.php目录下

对微信小程序开发有兴趣的朋友可以关注我的公众号【huangxiujie85】,第一时间获取博文推送。

公众号huangxiujie85

转载于:https://my.oschina.net/huangxiujie/blog/913641

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用蒙特卡洛方法计算派-python和R语言

用蒙特卡洛方法算pi&#xff0d;基于python和R语言 最近follow了MOOC上一门python课&#xff0c;开始学Python。同时&#xff0c;买来了概率论与数理统计&#xff0c;准备自学一下统计。&#xff08;因为被鄙视过不是统计专业却想搞数据分析&#xff09; 有趣的是书里面有一块讲…

51单片机智能小车循迹完整程序_电气与信息工程学院双创协会开展循迹小车培训...

为培养青年学子创新意识和创新能力&#xff0c;激发勇于创新的主动性和积极性&#xff0c;营造良好科技创新氛围&#xff0c;10月29日至30日&#xff0c;电气与信息工程学院双创协会于一教609、三教102和三教202开展循迹小车培训&#xff0c;该培训由电子1841班游碧文和电子184…

关闭C#主窗体弹出是否关闭对话框

在开发系统时,常常有这样一个问题,就是当关闭主窗体,也即退出系统时,如果想提示是否关闭,以免误操作,可以在主窗体的Main_FormClosing事件中添加一个对话框,代码如下: private void Main_FormClosing(object sender, FormClosingEventArgs e) { DialogResu…

AdonisUI - 用于 WPF 应用程序的轻量级 UI 工具包,提供经典但增强的 Windows 视觉效果...

介绍用于 WPF 应用程序的轻量级 UI 工具包&#xff0c;提供经典和增强的 Windows 视觉效果几乎所有 WPF 控件的默认样式和模板可根据需要使用的其他样式以方便使用两种配色方案&#xff08;浅色和深色&#xff09;也可用于自定义样式支持在运行时更改配色方案支持其他自定义配色…

Internet概念与TCP/ IP分层模型

Internet是世界上规模最大、用户最多、影响最大的计算机互联网络。本模块介绍Internet的概念及TCP/ IP分层模型。 一、Internet的概念 Internet的概念&#xff08;也可认为是Internet的结构&#xff09;可以从以下几个方面理解&#xff1a; 从网络通信的观点来看&#xff0c;In…

Android之在eclipse编译项目出现unable to resolve target android-20解决办法

1、问题 eclipse编译项目出现unable to resolve target android-20 2、解决办法 在project.properties文件里面修改targetandroid-20为targetandroid-21

数据结构关键路径_数据结构与算法之关键路径_一点课堂(多岸学院)

关键路径梳理活动的顺序仅仅是拓扑排序可以完成的功能之一&#xff0c;更有价值的是估量完成整个事件的最短时间。比如生产一辆汽车&#xff0c;虽然安排员工、准备原始材料是先行条件&#xff0c;但是组装各种零部件是可以同时进行的&#xff0c;例如制造轮子和发动机、外壳等…

ARP-Address Resolution Protocol-地址解析协议

主要内容摘自&#xff1a;图解TCP/IP ARP是一种解决地址问题的协议。以目标IP地址为线索&#xff0c;用来定位下一个应该接受数据分包的网络设备的mac地址。 如果目标主机不在同一个链路上时&#xff0c;可以通过ARP查找下一跳路由器的MAC地址。 不过ARP只适用于IPv4&#xff0…

C语言动态二维数组,结构体动态申请内存空间

在C语言中,申请一般数组时,数组大小必须是常量。即使是赋了特定值的变量,也不行,比如:int n=3;int a[3];这样的做法是错误的,我们需要动态申请数组内存,如下申请一个动态整数(int)二维数组: #include<stdio.h> #include<stdlib.h> int **pp(int m,int n…

WPF 实现音频播放动画控件

WPF开发者QQ群此群已满340500857 &#xff0c;请加新群458041663由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 01—代码如下一、创建AnimationAudio.xaml代码如下。<ResourceDictionary xmlns"http://schemas.micros…

C和指针之IO流和缓冲区

1、缓冲区介绍 缓冲区又称为缓存,它是内存空间的一部分,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区 2、为什么要缓冲区 从磁盘…

spring mvc 入门配置

1. 把所需jar拷贝到工程目录下WEB-INF/lib 2. 配置WEB.xml&#xff0c;配置前端控制器 org.springframework.web.servlet.DispatcherServlet <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.Dispa…

SQL Server编写函数获取汉字的拼音码(简拼)

目录 1. 拼音码简介 2.自定义获取拼音码函数 1. 拼音码简介 拼音码一般分为全拼、简拼、双拼三大类。在数据库系统查询中,使用简拼查询能打打提高输入的速度,提高查询效率。比如,在药店系统中,查询药品阿莫西林时,只需要输入阿莫西林药品对应的简拼码AMXL,点击查询即可…

node中间件mysql_nodejs 中使用mysql数据有没有类似 mongoose 的中间件?

在nodejs 操作mysql 时 &#xff0c;我遇到了这样的问题:一次http请求需要执行多个query&#xff0c;所有为了减少callback 我使用async中的waterfall函数 将query分函数来写&#xff0c;并且将mysql的句柄conn 进行传递&#xff0c;最后在waterfall的callback函数中关闭数据库…

Andorid之jni里面崩溃然后用errno分析结果解决问题

1、问题 在jni里面程序崩溃了,初步定位是这行代码,下面的结果运行既然小于0,我觉得很奇怪,理论上不应该啊,想不到为什么会小于0 if ((sock_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { 2、解决办法 在文件里面加上#include<errno.h>头文件,既然这里出错了…

#51CTO学院四周年# 还好没放弃,终于等到你~

作为一个小白&#xff0c;恩&#xff0c;白的不能再白的样子~游走于大佬身旁~每每看见大佬功成名就的样子~我就只能画饼充饥~望梅止渴~还好没放弃~在这里发现了小白变大佬的隧道~这里的人呐~都非常友善~这里的知识啊~性价比都超高~如果有来生&#xff0c;我希望早点遇见你~我们…

AspNetCoreRateLimit - ASP.NET Core 速率限制中间件。

介绍AspNetCoreRateLimit 是一种 ASP.NET Core 速率限制解决方案&#xff0c;旨在控制客户端可以根据 IP 地址或客户端 ID 向 Web API 或 MVC 应用程序发出请求的速率。AspNetCoreRateLimit 包包含一个 IpRateLimitMiddleware 和一个 ClientRateLimitMiddleware&#xff0c;对于…

Codeforces Round #260 (Div. 2)

Codeforces Round #260 (Div. 2) 题目链接 A&#xff1a;水题&#xff0c;事实上仅仅要推断有没有一个ai ! bi就可以&#xff0c;由于都保证是1 - n的不相等数字 B&#xff1a;找到2 3 4的循环节&#xff0c;发现仅仅有4和2&#xff0c;于是把大数%4&#xff0c;%2&#xff0c;…

开始ubuntu 14.04 的装X模式---终端模式下中文输入,听歌,上irc 开启framebuffer看电影 截图...

先上图吧 卡卡的全是在tty1 下的操作&#xff0c;看电影&#xff0c;听歌&#xff0c;截图 &#xff0c;看图 &#xff0c;上irc 等等&#xff0c;相当适合在小白面前装屁&#xff01; 需要安装的软件&#xff1a; 为了能正常显示中文&#xff1a;安装fbterm sudo apt-get ins…

comboBox绑定数据库后SelectedIndexChanged事件出错

comBox控件绑定数据库字段后,在窗体的Load事件之前就已经触发SelectedIndexChanged了,这时可以加一个标识,让其在Load事件之后激发。 bool flag;private void Education_Training_Load(object sender, EventArgs e){ MyDBase DB = new MyDBase(DBUser.sserver, DBUser.DBNam…