文档章节

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

秀杰
 秀杰
发布于 2017/06/03 10:48
字数 1049
阅读 225
收藏 2
点赞 0
评论 2

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

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

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

2.在hook.php中实现

<?php

require_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, MasterKey
	Client::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);
	// 调用成功,得到成功的应答 data
	console.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

© 著作权归作者所有

共有 人打赏支持
秀杰
粉丝 138
博文 84
码字总数 49285
作品 0
瑞安
iOS工程师
加载中

评论(2)

秀杰
秀杰

引用来自“yuzeng84”的评论

楼主好,转载到微信小程序联盟(http://www.wxapp-union.com/),注明出处和作者哈~
没问题~
小程序社区
小程序社区
楼主好,转载到微信小程序联盟(http://www.wxapp-union.com/),注明出处和作者哈~
使用CodeIgniter框架搭建RESTful API服务

使用CodeIgniter框架搭建RESTful API服务 发表于 2014-07-12 | 分类于 翻译笔记 | 6条评论 在2011年8月的时候,我写了一篇博客《使用CodeIgniter框架搭建RESTful API服务》,介绍了RESTful的...

thinkyoung ⋅ 2015/08/07 ⋅ 0

PHP 开源网站管理系统 - POSCMS

POSCMS 介绍 PHP 开源网站管理系统(PhpOpenSourceCMS,简称POSCMS)以开放、开源、灵活为产品理念,基于 PHP+MYSQL+CI 框架开发的开源 Web 内容管理系统,程序完美兼容 PHP7 ,并在 PHP7 基...

天睿云计算 ⋅ 2017/05/19 ⋅ 1

Windows10环境下Codelgniter安装及配置说明

CodeIgniter ,简称CI,是一套给 PHP 网站开发者使用的应用程序开发框架和工具包。 它的目标是让你能够更快速的开发,它提供了日常任务中所需的大量类库, 以及简单的接口和逻辑结构。通过减...

Yuanmes ⋅ 05/02 ⋅ 0

CodeIgniter中运用composer安装依赖包

基本信息 + CodeIgniter 版本:3.1.8+ Nginx: Tengine/2.1.2 (nginx/1.6.2)+ MySQL: Ver 14.14 Distrib 5.6.33, for Linux (x86_64) using EditLine wrapper+ PHP: 5.6.30+ Zend Engine ......

冷三叔 ⋅ 04/28 ⋅ 0

CodeIgniter的伪静态配置

基本信息 + CodeIgniter 版本:3.1.8+ Nginx: Tengine/2.1.2 (nginx/1.6.2)+ MySQL: Ver 14.14 Distrib 5.6.33, for Linux (x86_64) using EditLine wrapper+ PHP: 5.6.30+ Zend Engine ......

冷三叔 ⋅ 04/28 ⋅ 0

php基于thinkphp、smarty\CodeIgniter构建的开源的淘宝客cms程序下载

现在有很多开源的淘宝客软件cms,很多人不知道,所以,提供该服务,完全开源,比市面上的加密的好很多, 这些开源的淘宝客程序代码写的都非常简约,适合学习观摩,所以,收集了一些优秀的开源...

616921521 ⋅ 05/30 ⋅ 0

Yaf 中使用 Larvael Eloquent ORM

本教程示例代码见:https://github.com/creazy412/yaf2eloquentorm 背景介绍 Yaf 是鸟哥(Laruence)在俩年前写的一个PHP扩展的MVC框架. 开发Yaf的目的是为了解决使用框架带来的性能下降的经...

老K8 ⋅ 05/31 ⋅ 0

POSCMS V3.2.18 发布,跨平台网站内容管理系统

POSCMS V3.2.18 已发布,PHP开源内容管理系统(PhpOpenSourceCMS简称POSCMS)是Php+Mysql开发的一款开源的跨平台网站内容管理系统。POSCMS系统基于CodeIgniter框架,具有良好扩展性和管理性。...

天睿云计算 ⋅ 04/24 ⋅ 0

php-Codeigniter使用redis

1、安装redis 首先计算机上必须已经装了redis服务(redis数据库)并运行,详见另一篇文章:http://blog.csdn.net/wzj0808/article/details/54891178 2、安装phpredis <1>下载 项目地址:htt...

梦梦阁 ⋅ 06/06 ⋅ 0

Laradock的xdebug在vscode上使用的配置

简介 Laradock 是为 Docker 提供的完整 PHP 本地开发环境,和 Homestead 一样提供了一系列打包好(包括配置)的 Docker Image。Laradock 早期专注为 Laravel 打造 Docker 开发环境,因而最早...

Homelam ⋅ 05/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

笔试题之Java基础部分【简】【一】

基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他 1.length、length()和size() length针对...

anlve ⋅ 21分钟前 ⋅ 1

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 46分钟前 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 50分钟前 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 8

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部