easywechat之微信支付--在thinkPHP5中的使用
1. 准备工作
1.1 easywechat 安装完成
未安装移步至 -> http://www.cnblogs.com/flyphper/p/8484600.html
1.2 确定支付相关的配置参数已经配置好
<?php return [
/**
* Debug 模式,bool 值:true/false
*
* 当值为 false 时,所有的日志都不会记录
*/
'debug' => true,
/**
* 账号基本信息,请从微信公众平台/开放平台获取
*/
'app_id' => '', // AppID
'secret' => '', // AppSecret
'token' => '', // Token
'aes_key' => '', // EncodingAESKey,安全模式下请一定要填写!!!
/**
* 日志配置
*
* level: 日志级别, 可选为:
* debug/info/notice/warning/error/critical/alert/emergency
* permission:日志文件权限(可选),默认为null(若为null值,monolog会取0644)
* file:日志文件位置(绝对路径!!!),要求可写权限
*/
'log' => [
'level' => 'debug',
'permission' => 0777,
'file' => LOG_PATH.'easywechat.log',
],
/**
* OAuth 配置
*
* scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login
* callback:OAuth授权完成后的回调页地址
*/
'oauth' => [
'scopes' => ['snsapi_userinfo'],
'callback' => 'home/oauthallback',
],
/**
* 微信支付
*/
'payment' => [
'merchant_id' => '', // 商户号
'key' => '',
'cert_path' => '', // XXX: 绝对路径!!!!(前往微信公众平台上下载)
'key_path' => '', // 同上
// 'device_info' => '',
// 'sub_app_id' => '',
// 'sub_merchant_id' => '',
// ...
],
/**
* Guzzle 全局设置
*
* 更多请参考: http://docs.guzzlephp.org/en/latest/request-options.html
*/
'guzzle' => [
'timeout' => 3.0, // 超时时间(秒)
'verify' => true
]
];
2. 支付操作
2.1 添加订单
wechat1.php
<?php
/**
* ======================================
*
* Created by Super Demon W.
* Author: \/Lin\/ 764582547@qq.com
* Date: 2018/2/22
* Time: 17:09
*
* =======================================
*/
namespace app\home\logic; use think\Model;
use EasyWeChat\Foundation\Application;
use EasyWeChat\payment\Order;
use think\Config; class Wechat1 extends Model {
/**
* 支付准备
* @param $data
* @param $openid
* @return array
*/
public function WeixinPrePay($data, $openid) {
$options = Config::get('wechat');
$app = new Application($options);
$payment = $app->payment;
$attributes = [
'body' => '***-充值',
'out_trade_no' => $data['order_sn'],
'total_fee' => $data['money']*100,
#'spbill_create_ip' => '***',
'notify_url' => url('**/notify'), // 回调地址
'trade_type' => 'JSAPI',
'openid' => $openid,
]; $order = new Order($attributes);
$result = $payment->prepare($order);
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS') {
$prepayId = $result->prepay_id;
$json = $payment->configForPayment($prepayId);
return ['status' => 200, 'msg' => '', 'data' => $json];
} else {
return ['status' => 400, 'msg' => '调起支付失败,请稍后尝试'];
}
}
}
2.2 添加订单后调起支付
towxpay.php
namespace app\home\controller;
use app\home\logic\Wechat1;
use think\Session;
use think\Db; public function towxpay() {
$uid = Session::get('user_auth')['uid'];
$money = input('recharge_money', '');
$wechat = new Wechat1();
$order_sn = MakeOrderSn(); // 设置订单号
# 添加订单
$data = array(
// ...yourdata
);
$order_id = db('order')->insertGetId($data);
if (!$order_id) {
$this->error('订单添加失败');
}
$openid = db('member')->where('uid', $uid)->value('openid');
$check = $wechat->WeixinPrePay($data, $openid);
if ($check['status'] == 400) {
$this->error($check['msg']);
}
session::set('zejc_order_id', $order_id);
$this->assign('jsonData', $check['data']);
return $this->fetch();
}
2.3 调取支付页面
towxpay.html
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>发起支付-支付</title>
<script type="text/javascript">
//调用微信JS api 支付
function jsApiCall()
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest',{$jsonData},
function(res){
if (res.err_msg == "get_brand_wcpay_request:ok") { // 支付成功
location.href = '***?type=success';
}
if(res.err_msg == "get_brand_wcpay_request:fail") { // 支付失败
location.href = '***?type=fail';
}
if (res.err_msg == "get_brand_wcpay_request:cancel") { // 取消支付
location.href = '***?type=cancel';
}
}
);
} function callpay()
{
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}else{
jsApiCall();
}
}
callpay();
</script>
</head>
<body>
<div align="center" style="color: #00a157; margin-top: 20%">
支付中...
</div>
</body>
</html>
注: 统一下单后返回prepay_id后要调用小程序支付函数,有最重要的一步,是需要再次签名的,用统一下单返回的sign(签名)是没有用的。
================== 至此,微信支付结束 ===============
easywechat之微信支付--在thinkPHP5中的使用的更多相关文章
- Laravel使用EasyWechat 进行微信支付
微信支付和EasyWeChat这个包都是巨坑, 文档写的稀烂, 记录下防止以后又重复踩坑: 安装教程在这: https://www.jianshu.com/p/82d688e1fd2a
- Koa系框架(egg/cabloy)如何获取微信支付回调请求中的xml参数
背景 在Koa系框架(如EggJS)中进行微信支付开发时,遇到一个问题:微信支付平台会发送一个回调请求,通知支付订单的处理结果.该请求传入的参数是xml格式,而Koa中间件koa-bodyparser ...
- 微信支付.NET SDK 中的BUG(存疑)
BUG出现在类文件WxPayData.cs中的FromXml(string xml)方法 /** * @将xml转为WxPayData对象并返回对象内部的数据 * @param string 待转换的 ...
- 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包
微信支付教程系列之现金红包 最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...
- 微信支付开发(1) JS API支付
关键字:微信支付 微信支付v3 jsapi支付 统一支付 Native支付 prepay_id 作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/wxpayv3 ...
- 微信支付JsAPI
https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip 下载获取微信支付demo压缩包 打开压缩包,并将其中 Wxpay ...
- PHP微信支付开发实例
这篇文章主要为大家详细介绍了PHP微信支付开发过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 PHP微信支付开发过程,分享给大家,供大家参考,具体内容如下 1.开发环境 Thinkphp 3. ...
- 微信支付开发(1) JS API支付V3版(转)
http://www.cnblogs.com/txw1958/p/wxpayv3-jsapi.html 本文介绍微信支付下的jsapi实现流程 前言 微信支付现在分为v2版和v3版,2014年9月10 ...
- Android开发 --微信支付开发(转载!)(开发工具:Eclipse)
Android_APP 微信支付接口开发 日期:2015-10-06 12:47:33 作者: 来源: 人气:3549 1.首先说一下我们在开发微信支付接口的时候遇到最多和最疑惑的问题,那就是明明 a ...
随机推荐
- Java常用类--数字常用类
math java提供了基本的 + - * / %等基本算术运算的运算符,但对于更复杂的数学运算比如:三角函数,对数运算,指数运算就无能为力了.Java提供了Math工具类来完成这些复杂的运算,Mat ...
- OkHttp实现全局过期token自动刷新
#遇到问题: 当前开发的 App 遇到一个问题: 当请求某个接口时,由于 token 已经失效,所以接口会报错.但是产品经理希望 app 能够马上刷新 token ,然后重复请求刚才那个接口,这个过程 ...
- js面向对象之继承那点事儿根本就不是事
继承 说道这个继承,了解object-oriented的朋友都知道,大多oo语言都有两种,一种是接口继承(只继承方法签名):一种是实现继承(继承实际的方法) 奈何js中没有签名,因而只有实现继承,而且 ...
- 编译原理:基于状态转换图识别for语句
int state =0;while(state<9){ switch state{ case 0: if(ch=='f'){ state=1;getchar(ch); } case 1: if ...
- linux命令之read
对于写bash脚本的朋友,read命令是不可或缺的,需要实践一下就可以了解read命令的大致用途: 编写一个脚本: #!/bin/bash # hao32 test read echo -e &quo ...
- centos7添加图像化桌面并设置中文
我前面是使用的centos6.最近才最小化安装了一个centos7.4(最小化安装有很多命令都没有,所以不建议这样干).完了装了图形化界面和设置中文,感觉和centos6有些区别,所以记录一下过程. ...
- Go笔记-方法
[方法的概念] 在 Go 语言中,结构体就像是类的一种简化形式,那么面向对象程序员可能会问:类的方法在哪里呢?在 Go 中有一个概念,它和方法有着同样的名字,并且大体上意思相同:Go 方法是作 ...
- IDEA tomcat启动异常 org.apache.catalina.startup.ContextConfig parseWebXml
启动Tomcat发现有异常,总是无法启动,具体的异常日志为下图 具体的解决方法为:在tomcat的conf/content.xml中加上<Loader delegate="true&q ...
- js 面向对象 继承
继承方式有四种: 1.call 2.apply 3.prototype 4.for in call 和 apply 的主要区别: call 传参数只能一个一个的传, apply 因为是用数组,所以可以 ...
- quartz的一些记录
定时任务总会遇到任务重叠执行的情况,比如一个任务1分钟执行一次,而任务的执行时间超过了1分钟,这样就会有两个相同任务并发执行了.有时候我们是允许这种情况的发生的,比如任务执行的代码是幂等的,而有时候我 ...