13-pyg-12聚合支付解决方案
聚合支付解决方案
1.解决方案介绍
聚合支付,是融合了多方支付通道的平台,相对于支付宝、微信等第三方支付平台而言,聚合支付属于在第三方支付平台基础上,进行了技术融合的第四方平台。
本解决方案,是基于PC网站,集成聚合支付中的扫码支付方式,实现支付宝、微信同码的一种基础方案。
聚合支付原理图:
2.开通聚合支付服务
很多平台都提供了聚合支付服务,以下使用ping++聚合支付。
2.1 注册账号
访问 Ping++官网,注册账号并登录。
提交注册申请后,请前往注册邮箱,在邮件中点击注册链接,创建密码后进入管理平台。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Arln40Nm-1677340506362)(img/1561165614535.png)]
2.2 开发信息配置
参见官方文档:https://www.pingxx.com/docs/overview/config
2.2.1 Test 和 Live 环境
为了提高接入效率,Ping++ 提供了 Live 和 Test 两个工作模式供开发者接入时使用,两个环境均需要设置 AppID,两个环境的变更可以通过代码中的 Live Key 和 Test Key 的切换。
Test 环境
调用 Test 环境只需要注册 Ping++ 账户, Test 环境便于商户在没有申请下来渠道参数时先跑通支付流程,Test 开发中支付页面是 Ping++ 提供的模拟页面,不需要输入密码,直接点击支付即完成模拟付款。
Live 环境
调用 Live 环境需要商户已经和 Ping++ 签约并且成功完成渠道申请,将渠道参数填写在 Ping++ 管理平台上对应的渠道。 在 Live 环境下可以调用第三方渠道控件完成真实的付款。(参见 管理平台使用指南https://www.pingxx.com/docs/overview/dashboard)
2.2.2 获取 Test Key 和 Live Key
Test 和 Live 环境的 Key 均需要登录 Ping++ 管理平台获得
使用Live环境需要进行企业信息认证。
具体获取路径:点击管理平台右上角公司名称->企业面板->开发参数->基本密钥
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qy9MbD63-1677340506364)(img/dashboard_key1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-962BeMUe-1677340506364)(img/dashboard_key2.png)]
2.2.3 获取 App ID
App ID 是你在 Ping++ 平台上创建的应用标识,平台默认提供一个应用,完善企业信息后可添加新应用。
具体获取路径:登陆管理平台->点击「主页」按钮->对应的应用名称下方会显示 App_ID
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vQBELN7o-1677340506365)(img/dashboard_appid1.png)]
2.2.4 获取 Ping++ 公钥
Ping++ 公钥用于 Webhooks 真实性验证,验证该异步通知是否来自于 Ping++ 。 Ping++ 公钥具体获取路径:点击管理平台右上角公司名称->企业面板->开发参数->基本密钥
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LglOYu0s-1677340506368)(img/dashboard_key1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbKHRnNc-1677340506369)(img/dashboard_pingxxpub.png)]
其中,RSA密钥设置,见https://help.pingxx.com/article/123161
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3PZulzkD-1677340506371)(img/1561166691097.png)]
通过一键生成工具 生成商户私钥和公钥
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5uvDaqF-1677340506373)(img/1561166770207.png)]
将商户私钥、商户公钥、Ping++公钥 分别复制保存在文件中备用。
2.2.5 webhooks异步通知
点击应用名称,进入应用详情页
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x8yJhdca-1677340506374)(img/1561174598587.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7FHq5tdE-1677340506375)(img/1561174688082.png)]
展开左侧菜单,找到应用设置-》webhooks
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OwZbbtWW-1677340506376)(img/1561174754465.png)]
进入webhooks页面,点击右上角添加,添加通知地址
注:此地址,需要是外网可访问地址,否则异步通知会失败。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hrVdai0-1677340506385)(img/1561174798815.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-80zlOFyu-1677340506386)(img/1561174854177.png)]
2.3 扫码支付
参见扫码支付
概述和流程https://www.pingxx.com/docs/overview/basic_transaction/charge_refunds/qr?basic_transaction=true
Server端接入<https://www.pingxx.com/docs/server/basic_transaction/charge_refunds/qr?basic_transaction=true>
扫码支付分为 用户主扫 和 用户被扫 两种支付场景,用户主扫 又分为 动态码 和 固定码 两种方式。
本解决方案,基于 用户主扫 场景的 动态码 方式,实现了微信、支付宝同码的扫码支付功能。
流程参考:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RAgeq1xx-1677340506387)(img/qr_paymentflow.png)]
3.项目集成聚合支付
3.1 数据库设计
基于现有PC网站订单相关数据表,新增 支付记录表 (仅实现支付功能,未考虑退款等功能)。
3.1.1 支付记录表
CREATE TABLE `pyg_pay_log` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`order_sn` varchar(255) DEFAULT NULL COMMENT '订单编号',`json` text COMMENT '通知数据',`create_time` int(11) DEFAULT NULL,`update_time` int(11) DEFAULT NULL,`delete_time` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.1.2 创建模型
项目目录> php think make:model common\PayLog;
3.2 聚合支付
参见api文档:https://www.pingxx.com/api
基础交易 – Charges支付
Webhooks回调
附录–支付渠道属性值
…
3.2.1 服务器环境部署
项目目录下,执行以下命令,安装ping++功能包,用于聚合支付
composer require pingplusplus/pingpp-php
ping++功能说明地址:https://github.com/PingPlusPlus/pingpp-php
项目目录下,执行以下命令,安装qr-code功能包,用于生产二维码
composer require endroid/qr-code
二维码功能地址:https://github.com/endroid/qr-code
3.2.2 生成支付二维码
控制器文件 application/home/controller/Order.php 中 save 方法
创建订单成功后,展示支付方式页面之前,定义扫码支付链接,生成二维码图片,用于支付页面展示
public function save()
{//创建订单代码开始//...//创建订单代码结束//二维码图片中的支付链接(本地项目自定义链接,传递订单id参数)//$url = url('/home/order/qrpay', ['id'=>$order->order_sn], true, true);//用于测试的线上项目域名 http://pyg.tbyue.com$url = url('/home/order/qrpay', ['id'=>$order->order_sn, 'debug'=>'true'], true, "http://pyg.tbyue.com");//生成支付二维码$qrCode = new \Endroid\QrCode\QrCode($url);//二维码图片保存路径(请先将对应目录结构创建出来,需要具有写权限)$qr_path = '/uploads/qrcode/'.uniqid(mt_rand(100000,999999), true).'.png';//将二维码图片信息保存到文件中$qrCode->writeFile('.' . $qr_path);$this->assign('qr_path', $qr_path);//展示支付页面//...
}
视图文件 application/home/view/order/pay.html中
在
<div class="checkout py-container pay"><!--其他代码--><!--需增加的代码开始--><div class="qrpay"><div class="step-tit"><h5>扫码付(支持支付宝、微信)</h5></div><div class="step-cont"><img src="{$qr_path}" style="width:200px;height:200px;"></div></div><!--需增加的代码结束--><!--其他代码-->
</div>
3.2.3 ping++信息配置
将商户私钥文件(比如命名为 pingpp_rsa_private_key.pem ),移动到项目public目录下
配置文件 application/config.php中,新增以下配置项
//ping++聚合支付'pingpp' => ['api_key' => 'sk_test_KOGmH8SSuzrDOmLiDCzX9eX9',//test_key 或 live_key'app_id' => 'app_nTG0uPa5OWH4mH0m',// 应用app_id'private_key_path' => './pingpp_rsa_private_key.pem' //商户私钥文件路径],
3.2.4 扫码支付功能
控制器文件 application/home/controller/Order.php中
创建qrpay方法,完成扫码支付功能(对应于支付二维码中的链接地址)
//扫码支付public function qrpay(){$agent = request()->server('HTTP_USER_AGENT');//判断扫码支付方式if ( strpos($agent, 'MicroMessenger') !== false ) {//微信扫码$pay_code = 'wx_pub_qr';}else if (strpos($agent, 'AlipayClient') !== false) {//支付宝扫码$pay_code = 'alipay_qr';}else{//默认为支付宝扫码支付$pay_code = 'alipay_qr';}//接收订单id参数$order_sn = input('id');//创建支付请求$this->pingpp($order_sn,$pay_code);}
创建pingpp方法,用于发起支付请求到ping++
//发起ping++支付请求public function pingpp($order_sn,$pay_code){//查询订单信息$order = \app\common\model\Order::where('order_sn', $order_sn)->find();//ping++聚合支付\Pingpp\Pingpp::setApiKey(config('pingpp.api_key'));// 设置 API Key\Pingpp\Pingpp::setPrivateKeyPath(config('pingpp.private_key_path'));// 设置私钥\Pingpp\Pingpp::setAppId(config('pingpp.app_id'));$params = ['order_no' => $order['order_sn'],'app' => ['id' => config('pingpp.app_id')],'channel' => $pay_code,'amount' => $order['order_amount'],'client_ip' => '127.0.0.1','currency' => 'cny','subject' => 'Your Subject',//自定义标题'body' => 'Your Body',//自定义内容'extra' => [],];if($pay_code == 'wx_pub_qr'){$params['extra']['product_id'] = $order['id'];}//创建Charge对象$ch = \Pingpp\Charge::create($params);//跳转到对应第三方支付链接$this->redirect($ch->credential->$pay_code);die;}
3.2.5 异步通知
根据 2.2.5 添加的异步通知地址,创建对应控制器方法,
比如Notify控制器(application/home/controller/Notify.php), pingpp方法
思路:
接收参数,验证签名
验签成功,则修改订单状态,记录通知信息到支付记录表,返回响应成功码
验签失败,返回响应失败码
<?phpnamespace app\home\controller;use think\Controller;class Notify extends Controller
{//ping++异步通知 (webhooks)public function pingpp(){try{//接收参数$params = file_get_contents("php://input");//获取请求头信息,用于获取签名$headers = \Pingpp\Util\Util::getRequestHeaders();// 签名在头部信息的 x-pingplusplus-signature 字段$signature = isset($headers['X-Pingplusplus-Signature']) ? $headers['X-Pingplusplus-Signature'] : null;//获取ping++公钥用于签名$pub_key_path = "./pingpp_rsa_public_key.pem";$pub_key_contents = file_get_contents($pub_key_path);//验证签名$result = openssl_verify($params, base64_decode($signature), $pub_key_contents, 'sha256');if ($result === 1) {// 验证通过$event = json_decode($params, true);// 对异步通知做处理if (!isset($event['type'])) {header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request');exit("fail");}switch ($event['type']) {case "charge.succeeded":// 开发者在此处加入对支付异步通知的处理代码//修改订单状态$order_sn = $event['data']['object']['order_no'];$order = \app\common\model\Order::where('order_sn', $order_sn)->find();if(empty($order)){header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');exit("fail");}$order->order_status = 1;//已付款、待发货$order->pay_code = $event['data']['object']['channel'];$order->pay_name = $event['data']['object']['channel'] == 'wx_pub_qr' ? '微信支付' : '支付宝';$order->save();\app\common\model\PayLog::create(['order_sn' => $order_sn, 'json' => $params]);header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');break;case "refund.succeeded":// 开发者在此处加入对退款异步通知的处理代码header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');break;default:header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request');break;}} elseif ($result === 0) {http_response_code(400);echo 'verification failed';exit;} else {http_response_code(400);echo 'verification error';exit;}}catch (\Exception $e){$msg = $e->getMessage();http_response_code(500);echo $msg;exit;}}
}
3.2.5 支付结果轮询
控制器文件 application/home/controller/Order.php 中新增status 方法
用于查询订单状态
//查询订单状态public function status(){//接收订单编号$order_sn = input('order_sn');//查询订单状态/*$order_status = \app\common\model\Order::where('order_sn', $order_sn)->value('order_status');return json(['code' => 200, 'msg' => 'success', 'data'=>$order_status]);*///通过线上测试$res = curl_request("http://pyg.tbyue.com/home/order/status/order_sn/{$order_sn}");echo $res;die;}
视图页面application/home/view/order/pay.html 新增js代码
用于轮询订单状态
<script>$(function(){//轮询, 查询支付状态var order_sn = "{$order_sn}";var timer = setInterval(function(){$.ajax({"url":"{:url('home/order/status')}","type":"post","data":"order_sn=" + order_sn,"dataType":"json","success":function(res){if(res.code == 200 && res.data == 1){clearInterval(timer);location.href = "{:url('home/order/payresult')}?order_sn=" + order_sn;}}});}, 1000);})</script>
支付结果页面 Order控制器
public function payresult(){$order_sn = input('order_sn');$order = \app\common\model\Order::where('order_sn', $order_sn)->find();if(empty($order)){return view('payfail', ['msg' => '订单编号错误']);}else{return view('paysuccess', ['pay_name' => $order->pay_name, 'order_amount'=>$order['order_amount'], 'order' => $order]);}}
3.3 支付流程演示
订单提交成功,支付页面显示支付二维码
打开手机支付宝或者手机微信扫一扫,扫描图中二维码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfcXoNyj-1677340506390)(img/1561176196118.png)]
点击 付款 ,模拟 付款成功 状态, ping++平台会调用项目的webhooks异步通知接口。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyIpaxy2-1677340506391)(img/1561176173199.png)]
订单表数据: 订单状态order_status 为1,表示支付成功。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uzIxSLNf-1677340506392)(img/1561176363805.png)]
支付记录表:新增了订单对应支付记录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LGZwd0Hs-1677340506393)(img/1561176449372.png)]
PC浏览器页面 跳转到 支付结果 页面
4.总结
聚合支付,是融合了多方支付通道的平台,相对于支付宝、微信等第三方支付平台而言,聚合支付属于在第三方支付平台基础上,进行了技术融合的第四方平台。
本解决方案,是基于PC网站,集成聚合支付中的扫码支付方式,实现支付宝、微信同码的一种基础方案。
主要实现步骤为:开通聚合支付服务(真实环境需要开通第三方支付渠道),配置开发信息,项目集成。
项目集成又包含:生成支付二维码,扫码支付请求ping++的创建change对象接口、处理异步通知、支付结果轮询等。
13-pyg-12聚合支付解决方案相关推荐
- 2021年全球B2B在线支付解决方案行业调研及趋势分析报告
本文研究全球市场.主要地区和主要国家B2B在线支付解决方案的收入等,同时也重点分析全球范围内主要企业竞争态势,B2B在线支付解决方案收入和市场份额等.针对过去五年(2016-2020)年的历史情况,分 ...
- 汇付聚合支付自助接入的一点经验分享
近日,看到有些朋友在提问如何对接聚合支付,本人近期刚好对接过一家三方支付,有一点经验心得,算是供大家参考吧,不喜勿喷. 本人对接的聚合支付是一家三方支付的聚合支付解决方案,叫汇付天下聚合支付自助接入解 ...
- 汇付聚合支付自助接入解决方案快捷支付接口代码详解
上篇文章 <汇付聚合支付自助接入的一点经验分享> 发出后,受到众多朋友的阅读与评论,在此感谢大家的厚爱.看有些朋友评论说:很有用,能不能再讲具体一点,今天我就应大伙需求,来具体讲一讲里面的 ...
- 高校聚合支付平台设计解决方案
1.传统校园支付的现状与困境 近年来,随着学校的快速发展,招生规模也在不断扩大,各项收费标准不断提高且收费所涉及的种类也日渐增多.学校的各种收费模式也从"现场收取现金"逐渐发展到& ...
- 主流聚合支付对比分析【转】
前言 最近准备做聚合支付相关的产品,做新产品除了要知道自己做什么还要知道目前的竞品都做了些什么,所以对目前市面上的主流聚合支付产品做了对比分析,每家产品的一些实现细节,这里出于保护没有明确写出来,其实 ...
- 《中国聚合支付行业发展报告2018》发布 深度分析未来八大趋势
2018年12月27日,派盟咨询在北京正式发布<中国聚合支付行业发展报告2018>.派盟互通联合创始人.意锐新创COO关恒在报告发布会上表示:高速增长的聚合支付行业正在进入合规发展新阶段, ...
- 中国聚合支付市场深度调研及投资前景预测报告2022-2028年
中国聚合支付市场深度调研及投资前景预测报告2022-2028年 ═━┈┈━══━┈┈━══━┈┈━══━ [出版机构]: 中商经济研究网 第1章 中国聚合支付行业发展综述 1.1 聚合支付行业 ...
- 第三方支付下半场:聚合支付?
历史上尽管金融支付的方式不断更新变化,但它创新的目标始终没变,就是促进人类的商品交换."1月20日,北京金融控股集团有限公司董事长范文仲在"新技术对金融的影响与变革"20 ...
- 全球与中国聚合支付平台市场深度研究分析报告
[报告篇幅]:112 [报告图表数]:142 [报告出版时间]:2022年3月 报告摘要 本文研究全球及中国市场聚合支付平台现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美.欧洲.中 ...
最新文章
- 字符串按长度转换成数组
- 成功解决OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor
- HDU 1618 Oulipo KMP解决问题的方法
- bmw info source
- Bootstrap3基础 clearfix pull-left/right 辅助类样式 快速左右浮动
- Spring mvc Controller接口
- 这就是即将发布的苹果刘海屏MacBook Pro样机?
- ActiveMQ 即时通讯服务 浅析
- PyQt Graphics View 一个hello world例子
- springboot requestmapping 正则_SpringBoot三招组合拳,手把手教你打出优雅的后端接口...
- java 字符串查找程序,查找字符串的所有子集的Java程序
- android dumpsys 分析,Android中dumpsys命令用法简单介绍
- 怎么给视频添加水印?几个简单的步骤就搞定
- 遭遇盗取网络游戏帐号木马等
- pygame 窗口标题和图标设置
- Glidedsky系列—爬虫CSS反爬
- 小i机器人受邀出席首尔亚洲金融论坛
- Python脚本--别踩小bai块
- CPU玩游戏温度过高,导热硅脂有何妙招解决?
- this.$emit is not a function
热门文章
- 通俗易懂介绍英语中Being与having been 的区分
- js 操作元素属性、操作元素样式、display(none、block)
- itween 参数类型easeTypes的显示demo
- php批量随机生成数字不重复,php批量随机生成数字不重复
- Pandas的 loc iloc ix 区别
- 面向对象学不会看不懂?一文详解面向对象知识点总结
- LeetCode刷题day50
- java实现邮件发送_基于JavaMail的Java实现简单邮件发送功能
- Vue CSS多图宫格布局
- zpl php,php – 如何在垂直标签中垂直打印zpl条形码