文档教程模拟:

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中生成支付宝 二维码 扫码支付的更多相关文章

  1. pbfunc外部函数扩展应用-直接在Datawindow中生成QR二维码,非图片方式

    利用pbfunc外部函数在Datawindow中直接生成QR二维码,非图片方式.需要注意以下面几点: Datawindow的DataObject的单位必须为像素(Pixels). Datawindow ...

  2. golang中生成读取二维码(skip2/go-qrcode和boombuler/barcode,tuotoo/qrcode)

     1 引言 在github上有好用golan二维码生成和读取库,两个生成二维码的qrcode库和一个读取qrcode库. skip2/go-qrcode生成二维码,github地址:https://g ...

  3. spring boot高性能实现二维码扫码登录(中)——Redis版

    前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...

  4. 二维码生成插件qrious及网站扫码登录的一些理解

    什么是二维码 ​ 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型. ...

  5. 利用WPF生成Q币充值二维码——扫码登录篇

    一.前言 虽然腾讯官方不支持使用二维码充值Q币,但对于喜欢钻研的人来说这不是问题,本文利用WPF技术讲解从扫码登录到生成Q币充值二维码的一整套解决方案. 因为充值Q币需要先用QQ号登录官网.所以我们首 ...

  6. spring boot高性能实现二维码扫码登录(上)——单服务器版

    前言 目前网页的主流登录方式是通过手机扫码二维码登录.我看了网上很多关于扫码登录博客后,发现基本思路大致是:打开网页,生成uuid,然后长连接请求后端并等待登录认证相应结果,而后端每个几百毫秒会循环查 ...

  7. spring boot高性能实现二维码扫码登录(下)——订阅与发布机制版

     前言 基于之前两篇(<spring boot高性能实现二维码扫码登录(上)——单服务器版>和<spring boot高性能实现二维码扫码登录(中)——Redis版>)的基础, ...

  8. 公司开发的APP,如何生成一个二维码,供客户下载使用

    1.其实和简单,因为一般的用户使用扫一扫,大多数都是用微信自带的扫一扫工具 而,微信打开的二维码页面,会自动屏蔽apk文件,所以显然把apk的url生成一个二维码,让用户扫一扫就能直接下载,这样是行不 ...

  9. 利用websocket实现微信二维码码扫码支付

    由于业务需要引入微信扫码支付,故利用websocket来实现消息推送技术. 实现大致流程:首先客户端点击微信支付按钮,触发微信支付接口,同时微信支付响应成功参数后,连接websocket客户端,此刻利 ...

随机推荐

  1. Stitching模块中leaveBiggestComponent初步研究

    在Stitching模块中以及原始论文<Automatic Panoramic Image Stitching using Invariant Features>3.2中,都有" ...

  2. 20145322 何志威《网络对抗》shellcode注入&Return-to-libc攻击深入

    基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址. execstack - ...

  3. 存储结构简明分析——DAS、NAS和SAN

    存储的总体分类     主流存储结构   网络存储结构大致分为三种:直连式存储(DAS:Direct Attached Storage).存储区域网络(SAN:Storage Area Network ...

  4. [微信开发] - weixin4j获取网页授权后的code进而获取用户信息

    weixin4j封装好的SnsComponent组件中的方法可以执行该步骤 WeixinUserInfoController : package com.baigehuidi.demo.control ...

  5. IPv4数据报格式

    网络层的分组为数据报,数据报为首部和数据两部分组成,如下图所示. 首部的长度是以4个字节为单位,长度可以是20-60字节,这跟首部的HLEN字段有关. 版本: 这个4位字段定义了IP协议的版本,目前主 ...

  6. python 获取进程执行的结果

    import subprocessp = subprocess.Popen([r'ls'],stdout=subprocess.PIPE) result = p.stdout.read()print( ...

  7. Qt5_vs2013_error_C2001: 常量中有换行符__ZC

    ZC: 这里是解决 Windows平台下的这个 编译error :“error C2001: 常量中有换行符”. ZC: 我现在(20161221)的处理方式:vs2010或vs2015 将cpp文件 ...

  8. C# Word转PDF/HTML/XML/XPS/SVG/EMF/EPUB/TIFF

    一款有着强大的文档转换功能的工具,无论何时何地都会是现代办公环境极为需要的.在本篇文章中,将介绍关于Word文档的转换功能(Word转XPS/SVG/EMF/EPUB/TIFF).希望方法中的代码能为 ...

  9. Filter实现session超时自动跳转到login页,超过试用期不许登录

    新建一个过滤器 package com.autumn.filter; import com.autumn.pojo.Users; import javax.servlet.*; import java ...

  10. Hive之序列化与反序列化(SerDe)

    序列化与反序列化的作用 1,序列化是对象转化为字节序列的过程: 2,反序列化是字节码恢复为对象的过程: 序列化的作用主要有两个: (1),对象向的持久化:即把对象转换成字节码后保存文件: (2),对象 ...