基于thinkphp5.0和支付宝面对面扫码支付DEMO制作的扫码支付
今天接口申请下来,下载了官方demo对着调试了一天,终于实现想要的功能,先看图

选择支付宝支付

跳出二维码弹窗

手机支付宝进行扫码支付

支付完成,点击支付完成按钮跳转到订单列表

实现步骤:
1 支付宝接口申请,这个自行申请哦

2 下载官方扫码支付DEMO http://aopsdkdownload.cn-hangzhou.alipay-pub.aliyun-inc.com/demo/F2FPay_Demo_php.zip?spm=a219a.7629140.0.0.8TzIkn&file=F2FPay_Demo_php.zip
将其中的f2fpay,aop两个文件夹复制到extend/alipay目录下.
其中的AlipayTradeService.php 我有稍作修改,到时在附件传上来.

3 点击页面的支付按钮后,异步请求二维码

//发起支付宝支付public function alipay(){if (!request()->isAjax()) {$this->error('该操作仅支持异步操作');}$productId = input('productId',0);$product = model('Product')->where('id',$productId)->find();if (empty($product)) {$this->error('产品不存在');}if ($product['status'] != 1) {$this->error('产品已下架');}$outTradeNo = out_trade_no();$data = ['notify_url' => url('api/Notify/alipay','',false,true), //回调链接'return_url' => '','out_trade_no' => $outTradeNo, //订单号'subject' => '爱站SEO '.$product['title'], //产品标题'total_fee' => $product['cash'],//订单金额,单位为元'body' => $product['remark'], //产品描述];$alipay = new Alipay;$result = $alipay->qrpay($data);if(!$result['code']){return $this->error($result['msg']);}//录入订单数据$orderData = ['order_num' => $data['out_trade_no'],// 'prepay_id' => $prepayId,'product_id' => $productId,'uid' => session('uid'),'count' => 1,'pay_fee' => $data['total_fee'] * 100,'create_time' => time(),'paied_time' => 0,'status' => 1,];$res = db('Order')->insert($orderData);if (!$res) {$this->error('订单未成功生成');}//二维码生成$qrcodeImg = make_qrcode($result['msg'],$data['out_trade_no']);return ['code' => 1,'msg' => '请用支付宝支付','qrcodeImg' => $qrcodeImg, //二维码图片地址'productInfo' => $product //产品信息];}

先检查产品是否可用销售,然后生成订单号,调用Alipay支付请求,订单录入后,生成二维码图片,传给前端.
Alipay.php 我是放在common/pay/目录下的

<?php
namespace app\common\pay;use think\Validate;
use think\Log;
/**
* 支付宝扫码支付
*/
class Alipay
{public function qrpay($data = []){$validate = new Validate([['out_trade_no','require|alphaNum','订单编号输入错误|订单编号输入错误'],['total_fee','require|number|gt:0','金额输入错误|金额输入错误|金额输入错误'],['subject','require','请输入标题'],['body','require','请输入描述'],['notify_url','require','异步通知地址不为空'],]);if (!$validate->check($data)) {return ['code'=>0,'msg'=>$validate->getError()];}// 支付超时,线下扫码交易定义为5分钟$timeExpress = "5m";import('alipay.f2fpay.model.builder.AlipayTradePrecreateContentBuilder', EXTEND_PATH);import('alipay.f2fpay.service.AlipayTradeService', EXTEND_PATH);// 创建请求builder,设置请求参数$qrPayRequestBuilder = new \AlipayTradePrecreateContentBuilder();$qrPayRequestBuilder->setOutTradeNo($data['out_trade_no']);$qrPayRequestBuilder->setTotalAmount($data['total_fee']);$qrPayRequestBuilder->setTimeExpress($timeExpress);$qrPayRequestBuilder->setSubject($data['subject']);$qrPayRequestBuilder->setBody($data['body']);// 调用qrPay方法获取当面付应答$config = config('alipay');if (!empty($data['notify_url'])) {$config['notify_url'] = $data['notify_url'];}$qrPay = new \AlipayTradeService($config);$qrPayResult = $qrPay->qrPay($qrPayRequestBuilder);//  根据状态值进行业务处理switch ($qrPayResult->getTradeStatus()){case "SUCCESS":// echo "支付宝创建订单二维码成功:"."<br>---------------------------------------<br>";$response = $qrPayResult->getResponse();return ['code'=>1,'msg'=>$response->qr_code];break;case "FAILED":// echo "支付宝创建订单二维码失败!!!"."<br>--------------------------<br>";return ['code'=>0,'msg'=>'支付宝创建订单二维码失败!!!'];break;case "UNKNOWN":// echo "系统异常,状态未知!!!"."<br>--------------------------<br>";return ['code'=>0,'msg'=>'系统异常,状态未知!!!'];break;default:return ['code'=>0,'msg'=>'不支持的返回状态,创建订单二维码返回异常!!!'];break;}return ;}public function notify_alipay(){import('alipay.aop.AopClient');$config = config('alipay');$out_trade_no = input('post.out_trade_no');$transaction_id = input('post.trade_no');$aop = new \AopClient;$aop->appId = $config['app_id'];$aop->rsaPrivateKey = $config['merchant_private_key'];$aop->alipayrsaPublicKey = $config['alipay_public_key'];$aop->signType = $config['sign_type'];$result = $aop->rsaCheckV1($_POST,'',$config['sign_type']);if ($result) {if(input('trade_status') == 'TRADE_FINISHED' || input('trade_status') == 'TRADE_SUCCESS') {// 处理支付成功后的逻辑业务$order = db('Order')->where(['order_num'=>$out_trade_no])->find();if (!$order) {Log::write('order not exists');return 'order not exists';}//订单状态错误 1 未付款 其他状态均为已处理的状态if ($order['status'] != 1) {Log::write('order is completed:'.$order['status']);return true;}if ($order['pay_fee'] != input('post.total_amount') * 100) {Log::write('total_amount is error:'.$order['pay_fee'].','.input('post.total_amount'));return 'total_amount is error';}$order['transaction_id'] = $transaction_id;$order['paied_time'] = time();$order['status'] = 2;db('Order')->update($order);//支付成功的逻辑return 'success';}Log::write('trade_status is error:'.input('trade_status'));return 'fail';}Log::write('sign verify is error:'.var_export($_POST));return 'fail';}
}

主要有qrpay二维码扫描支付的请求,notify_alipay接收异步通知的处理逻辑
这里用到的接口配置,我是放在/application/extra/alipay.php 下面

<?php
return [//签名方式,默认为RSA2(RSA2048)'sign_type' => "RSA2",//支付宝公钥'alipay_public_key' => "",//商户私钥'merchant_private_key' => "",//编码格式'charset' => "UTF-8",//支付宝网关'gatewayUrl' => "https://openapi.alipay.com/gateway.do",//应用ID'app_id' => "",//异步通知地址,只有扫码支付预下单可用'notify_url' => "http://www.baidu.com",//最大查询重试次数'MaxQueryRetry' => "10",//查询间隔'QueryDuration' => "3",//日志文件'log_file' => RUNTIME_PATH.'/log/'.date('Ym').'/'.date('d').'.log',
];

填写公钥,私钥,异步通知地址,我自己添加了一个日志文件,为了结合请求的日志记录write_log使用.

alipay.rar

Buy me a cup of coffee :)

基于thinkphp5.0和支付宝面对面扫码支付DEMO制作的扫码支付相关推荐

  1. 最新基于ThinkPHP5.0+BootStrap框架开发的自适应WAP手机端响应式界面博客系统PHP源码

    <h2>源码介绍</h2> 分享一款基于ThinkPHP5.0框架开发的自适应WAP手机端响应式界面博客系统PHP源码,前端界面采用BootStrap框架设计,使得博客系统界面 ...

  2. 前台模板 海豚php_GitHub - cbw1820446/DolphinPHP: 海豚PHP——快速开发框架(基于ThinkPHP5.0.3)...

    DolphinPHP DophinPHP(海豚PHP)是一个基于ThinkPHP5.0.3开发的一套开源PHP快速开发框架,DophinPHP秉承极简.极速.极致的开发理念,为开发集成了基于数据-角色 ...

  3. php支持上传音乐播放网,基于ThinkPHP5框架开发的响应式在线音乐播放网站PHP源码+WAP手机端|在线支付+会员购买+音乐上传...

    源码介绍 基于ThinkPHP5框架开发的响应式在线音乐播放网PHP源码,是一款开源的跨平台音乐管理系统,基于国内最优秀的开源框架ThinkPHP5.0.11内核开发的在线DJ音乐播放分享网站,完全免 ...

  4. think php上传图片,基于ThinkPHP5.0实现图片上传插件

    这篇文章主要介绍了关于基于ThinkPHP5.0实现图片上传插件,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 thinkphp5.0 图片上传插件可预览裁剪图片和保存原图片,执行裁剪 ...

  5. dz index.php 编写,Thinkphp5.0.24框架开发仿DZ应用平台资源站源码

    [温馨提示]源码包解压密码:www.youhutong.com 资源描述 Thinkphp5.0.24框架开发仿DZ应用平台资源站源码 源码无任何加密,可用来做资源下载站,素材资源站,交易站等等... ...

  6. 一分钟教会你利用thinkphp5.0接入支付宝

    一分钟教会你利用thinkphp5.0接入支付宝 备注:thinkphp版本:5.0.24 接入前的准备: 1.沙箱环境网址:https://openhome.alipay.com/platform/ ...

  7. php整合支付宝,Thinkphp5.0整合支付宝在线下单

    thinkphp5.0支付宝在线支付下单整个流程,包括创建订单.支付成功回调更新订单状态.最终跳转到商户订单详情页 查看演示 下载资源: 17 次 下载资源 下载积分: 998 积分 支付宝在线支付控 ...

  8. 网易严选php版本小程序,Thinkphp5.0内核开发仿网易严选微信小程序商城源码 电商小程序源码...

    仿网易严选微信小程序商城源码 电商小程序源码 安装环境:php5.3及以上+mysql,开启https Thinkphp5.0内核开发的电商类小程序源码整站后端+前台仿网易严选商城化妆品电商小程序,完 ...

  9. 基于thinkPHP5.0开发,傻瓜式安装小程序及公众号商城

    CRMEB小程序商城,是我们开发的一款开源电商系统,为中小企业提供最佳的新零售解决方案.采用thinkPHP5.0框架开发,执行效率.扩展性.稳定性值得信赖.永久更新维护,界面美观大方,一键式傻瓜安装 ...

最新文章

  1. python运行完不能显示图_Python Pygame无法正确显示图像
  2. mysql 使用手册 权限_创建MySQL用户及用户权限管理
  3. JAVA——监听器ActionListener与MouseListener执行顺序
  4. php 函数变量的顺序,PHP实现参数的自定义顺序调用 | 剑花烟雨江南
  5. keep怎么生成运动轨迹_空间新物种 !| 垂直运动路径与商业综合体的整合与植入...
  6. 从微服务跨越到中台,架构领域年度盘点!
  7. PHP中的数组(排序)
  8. 浅谈Java及应用学java
  9. SIM900A 发送中英文短信
  10. 国内java报表软件简单对比
  11. 魅族缘何成为双十一最冰火手机厂商
  12. 光线:提高照片的艺术感
  13. 在html5页面中添加canvas,HTML页面中添加Canvas标签示例
  14. PTA阿泽的交友标准
  15. 基于RFM-SCAN的图像配准算法的matlab仿真
  16. 北京联合大学 计算机应用大赛,北京联合大学计算机应用大赛方案.pdf
  17. ORACLE数据库监控系统
  18. 07-字体及文本样式
  19. 怎样在两个局域网内共享一台打印机 。常用网络命令及命令实例详解
  20. 小姐姐拯救计划之我的群晖NAS会内网穿透nps篇

热门文章

  1. 递归-PTA循环日程表
  2. Google Earth Engine(GEE)——利用sentinel-2数据进行农作物提取分析
  3. python-turtle 小发现
  4. 《隐忍的老虎司马懿》
  5. 利用Python根据模板生成Word文档
  6. 怎样把电脑默认安装C盘的位置改成D盘?
  7. Android 详解第三方介质交互之NFC,并且实现读你的交通卡,酒店房卡,学生证!
  8. 快速傅里叶变换(FFT)和逆快速傅里叶变换(IFFT)
  9. 如何删除计算机文件类型,怎么删除win10.1电脑中的文件夹分类?
  10. java循环引用 垃圾回收,深入解析Java垃圾回收机制