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客户端,此刻利 ...
随机推荐
- Vim 操作命令不完全汇总
.命令:"重复上次修改": x命令:删除光标下的字符: u命令:撤销上次修改: dd命令:删除整行: >G命令:增加从当前行到文档末尾处的层级缩进: $命令:把光标移至行尾: ...
- 【yum】yum的使用
Yum官网 Yum的缓存 Yum仓库 Yum命令 Yum插件 yum的缓存 通过缓存可以提升我们环境的搭建效率,直接把原来缓存好的安装包数据放到新环境,省去了几个G的下载,甚至,有些时候客户现场不能联 ...
- AJAX,JSON,GSON
AJAX将数据使用JSON格式发送给后端Servlet或其他语言解析. 对JSON内容使用GSON外扩展包进行分解,并使用(如查询用户名是否已经被注册), 最后使用Map集合设置新的返回状态码,并使用 ...
- NO.1 在Eclipse中安装Maven插件安装详解
前言 本来是没打算写博客的,作为一个13年毕业的菜鸟,自认为水平太渣写不出什么好文章,但是前些日子看到一篇鼓励性质的文章说,技术人员的成长靠的就是点点滴滴的积累,博客内容不一定包含多么高深的内容,但是 ...
- 判断一个数是否是4的n次方
def is_Power_of_four(n): while n and not (n & 0b11): n >>= ) print(is_Power_of_four()) pri ...
- shell 输入不显示在监视器上
#!/bin/bash read -s -p "Enter your password:" pass echo "your password is $pass" ...
- 依据分辨率区分手机、平板、pc
/*手机*/ @media screen and (max-width:600px){ #header,#content,#footer{width:400px;} .right,.center{ma ...
- Android反射机制:手把手教你实现反射
什么是反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...
- Java回顾之I/O
这篇文章主要回顾Java中和I/O操作相关的内容,I/O也是编程语言的一个基础特性,Java中的I/O分为两种类型,一种是顺序读取,一种是随机读取. 我们先来看顺序读取,有两种方式可以进行顺序读取,一 ...
- bzoj 1318 [SPOJ744] Longest Permutation (排列)
大意: 给定序列, 求选出一个长度为k的区间, 使得区间内的数为[1,k]的排列, 且要求k最大 这题好神啊. 每个排列有且仅有一个1, 我们按1将序列分成若干子问题来处理, 而每个位置最多属于两个子 ...