laravel中生成支付宝 二维码 扫码支付
文档教程模拟:
http://www.023xs.cn/Article/37/laravel5%E9%9B%86%E6%88%90%E6%94%AF%E4%BB%98%E5%AE%9Dalipay%E6%89%AB%E7%A0%81%E6%94%AF%E4%BB%98%E6%B5%81%E7%A8%8B%EF%BC%88Laravel%E6%94%AF%E4%BB%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%89
1、在对应的蚂蚁金服,申请【网页&移动应用】,将对应的应用上线,并签约【电脑网站支付】和【手机网站支付】
2、在项目中composer对应的包【项目里面的vendor/latrell包上传coding的话,需要复制本地后在上传】
3、按照文档修改对应的配置文件,其中各个支付的回调可以单独配置
4、生成对应的地址后,将地址使用二维码生成工具 生成二维码图片 返回即可
示例代码:
订单生成,提交订单代码示例:
public function ccsppUserDoVipOrderAlyPc(Request $request)
{
$data = $request->all();
$userId = $data['user_id'];
$user = \DB::table('user')
->where('id',$userId)
->first();
//此处订单和支付一起生成
$money = 0.01;
$order['order_uid'] = $data['user_id'];
$order['order_uname'] = $user->user_name;
$order['order_type'] = 1;
$order['order_time'] = time();
$order['order_money'] = $money;
$order['order_status'] = 1;
$order['order_tel'] = $user->user_tel;
$order['order_sid'] = str_random(4) .time();
\DB::beginTransaction();
// 创建订单
$res_order = \DB::table('order')
->insertGetId($order);
if(!$res_order){
\DB::rollback();
\DB::commit();
return ['code' => 1002, 'data' => ['message' => '订单生成失败!']];
} //生成支付宝的订单
$config = config('latrell-alipay-web');
$alipay = app('alipay.web');
$alipay->setOutTradeNo($order['order_sid']);
$alipay->setTotalFee($order['order_money']);
$alipay->setSubject('交易内容');
$alipay->setBody('交易内容');
$alipay->setNotifyUrl($config['notifyUrlJkAly']);//设置回调地址 $alipay->setQrPayMode('1'); //该设置为可选1-5,添加该参数设置,支持二维码支付。
$basePath = base_path();
$basePath = $basePath."/public/uploads/code/";
$img_file = $basePath.'aly'.$order['order_sid'].'.png';
$alcode = 'aly'.$order['order_sid'].'.png';
$alycode = self::urlUsePic . $alcode;
$abc = \QrCode::format('png')->size(200)->margin(0)->generate($alipay->getPayLink(),$img_file);
// 跳转到支付页面。
$aliPayUrl = $alipay->getPayLink();
//订单生成后给订单生成对应的支付二维码
\DB::commit();
return ['code' => 1000,'alycode' => $alycode];
}
回调配置代码示例:
latrell-alipay:
return [ //合作身份者id,以2088开头的16位纯数字。
'partner_id' => '208****12752', //卖家支付宝帐户。
'seller_id' => 'g******l@da****.com'
];
latrell-alipay-web:
return [ // 安全检验码,以数字和字母组成的32位字符。
'key' => 'bbpjx64******ggve61', //签名方式
'sign_type' => 'MD5', // 服务器异步通知页面路径。支付1的回调
'notify_url' => 'https://test/notify_url', // 服务器异步通知页面路径。支付2的回调
'notifyUrlJkAly' => 'https://test/notifyUrlJkAly', // 服务器异步通知页面路径。支付3的回调
'notifyUrlVideoAly' => 'https://test/notifyUrlVideoAly', // 服务器异步通知页面路径。支付4的回调(在订单生成时选择参数)
'notifyUrlMeetingAly' => 'https://test/notifyUrlMeetingAly', // 页面跳转同步通知页面路径。
// 'return_url' => 'https://test/aliPayReturn'
'return_url' => ''
];
回调路由单个代码示例:
官方示例:1
public function notify_url(Request $request)
{
// 验证请求。
if (!app('alipay.web')->verify()) {
Log::notice('Alipay notify post data verification fail.', [
'data' => $request->instance()->getContent()
]);
return 'fail';
}
// 判断通知类型。
switch ($request ->input('trade_status','')) {
case 'TRADE_SUCCESS':
case 'TRADE_FINISHED':
// TODO: 支付成功,取得订单号进行其它相关操作。
Log::debug('Alipay notify post data verification success.', [
'out_trade_no' => $request -> input('out_trade_no',''),
'trade_no' => $request -> input('trade_no','')
]);
break;
}
$data = $request->all();
$time_now = time();
\DB::table('test')->where('id',1)->update(['name'=>$data['out_trade_no'],'time' => $time_now]);
return "success";
}
自己示例:2 已验证,可以使用
public function notifyUrlJkAly(Request $request)
{
$data = $request->all();
$order_sid = $data['out_trade_no'];
$time_now = time();
//修改订单用户和状态
\DB::table('order')->where('order_sid',$order_sid)->update(['order_status'=>2,'order_ptime' => $time_now]);
//同时根据订单的类型修改用户的会员类型和 版本到期时间 默认加一年
$order_res = \DB::table('order')->where('order_sid',$order_sid)->first();
if($order_res){
//如果是版本支付订单,就修改用户的支付状态,和版本使用期限
$uid = $order_res->order_uid;
$date = date('Y',$time_now) + 1 . '-' . date('m-d H:i:s');//一年后日期
$ytime = strtotime($date);
$ress = \DB::table('user')->where('id',$uid)->update(['user_type' => 2,'user_btime' => $time_now,'user_etime' => $ytime]);
}
return "success";
}
注:支付宝退款 时会访问 调用支付成功回调时的接口,所以会产生 数据库订单状态 修改不了的现象,处理办法是在 支付成功回调中 对订单进行状态判断,只有未支付的状态才可以修改订单为支付状态
并且在回调中,处理完后要按照文档上的 返回"success" ,不能自己胡乱写
例如:
/**
* 购买会议活动报名回调 支付宝 url()
* param ()
*/
public function notifyUrlMeetingAly(Request $request)
{
$data = $request->all();
$order_sid = $data['out_trade_no'];
$time_now = time(); //修改订单支付状态
$order = \DB::table('order')->where('order_sid',$order_sid)->first();
$order_status = $order->order_status;
if($order_status == 1){
\DB::table('order')->where('order_sid',$order_sid)->update(['order_status'=>2,'order_ptime' => $time_now]);
//修改用户报名关系表订单状态
\DB::table('morder')->where('morder_sid',$order_sid)->update(['morder_status'=>1]);
} return 'success';
}
laravel中生成支付宝 二维码 扫码支付的更多相关文章
- pbfunc外部函数扩展应用-直接在Datawindow中生成QR二维码,非图片方式
利用pbfunc外部函数在Datawindow中直接生成QR二维码,非图片方式.需要注意以下面几点: Datawindow的DataObject的单位必须为像素(Pixels). Datawindow ...
- golang中生成读取二维码(skip2/go-qrcode和boombuler/barcode,tuotoo/qrcode)
1 引言 在github上有好用golan二维码生成和读取库,两个生成二维码的qrcode库和一个读取qrcode库. skip2/go-qrcode生成二维码,github地址:https://g ...
- spring boot高性能实现二维码扫码登录(中)——Redis版
前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...
- 二维码生成插件qrious及网站扫码登录的一些理解
什么是二维码 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型. ...
- 利用WPF生成Q币充值二维码——扫码登录篇
一.前言 虽然腾讯官方不支持使用二维码充值Q币,但对于喜欢钻研的人来说这不是问题,本文利用WPF技术讲解从扫码登录到生成Q币充值二维码的一整套解决方案. 因为充值Q币需要先用QQ号登录官网.所以我们首 ...
- spring boot高性能实现二维码扫码登录(上)——单服务器版
前言 目前网页的主流登录方式是通过手机扫码二维码登录.我看了网上很多关于扫码登录博客后,发现基本思路大致是:打开网页,生成uuid,然后长连接请求后端并等待登录认证相应结果,而后端每个几百毫秒会循环查 ...
- spring boot高性能实现二维码扫码登录(下)——订阅与发布机制版
前言 基于之前两篇(<spring boot高性能实现二维码扫码登录(上)——单服务器版>和<spring boot高性能实现二维码扫码登录(中)——Redis版>)的基础, ...
- 公司开发的APP,如何生成一个二维码,供客户下载使用
1.其实和简单,因为一般的用户使用扫一扫,大多数都是用微信自带的扫一扫工具 而,微信打开的二维码页面,会自动屏蔽apk文件,所以显然把apk的url生成一个二维码,让用户扫一扫就能直接下载,这样是行不 ...
- 利用websocket实现微信二维码码扫码支付
由于业务需要引入微信扫码支付,故利用websocket来实现消息推送技术. 实现大致流程:首先客户端点击微信支付按钮,触发微信支付接口,同时微信支付响应成功参数后,连接websocket客户端,此刻利 ...
随机推荐
- 存储结构简明分析——DAS、NAS和SAN
存储的总体分类 主流存储结构 网络存储结构大致分为三种:直连式存储(DAS:Direct Attached Storage).存储区域网络(SAN:Storage Area Network ...
- Python学习札记(三十四) 面向对象编程 Object Oriented Program 5
参考:获取对象信息 NOTE 1.type()函数可以用来判断对象的类型: >>> type(123) <class 'int'> >>> type(' ...
- [osgearth]Earth文件详解
<!—type 属性可以是geocentric和projected两种模式,分别对应地心坐标系和平面投影坐标系,默认是地心坐标模式.Version是osgEarth的主版本号,必须有版本号--& ...
- [Kafka] - Kafka Java Consumer实现(二)
Kafka提供了两种Consumer API,分别是:High Level Consumer API 和 Lower Level Consumer API(Simple Consumer API) H ...
- 1003: [ZJOI2006]物流运输 最短路+dp
https://www.lydsy.com/JudgeOnline/problem.php?id=1003 数据范围很小,怎么瞎搞都行,n方dp,然后跑出最短路暴力转移,需要注意的是不能使用的可能有多 ...
- chrome插件访问原始页面的变量
开发chrome插件时遇到需要获取原始网页中的一个js变量的值问题.由于content.js和原始网页的作用域环境不同,无法直接获取变量的值,提示undefined.谷歌找到大神提供的办法.综合起来记 ...
- Leetcode 16
//一次AC 有点爽的class Solution { public: int threeSumClosest(vector<int>& nums, int target) { ; ...
- 331. Verify Preorder Serialization of a Binary Tree -- 判断是否为合法的先序序列
One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, ...
- 高可用数据采集平台(如何玩转3门语言php+.net+aauto)
同类文章:高并发数据采集的架构应用(Redis的应用) 吐槽下:本人主程是PHP,团队里面也没有精通.net的人才,为了解决这个平台方案,还是费了一部分劲. 新年了,希望有个新的开始.技术+团队管理都 ...
- 传智:自己简单实现一个struts2框架的demo
struts2的结构图: 代码实现: 组织结构: 主要代码: package cn.itcast.config; import org.apache.log4j.Logger; import org. ...