当前位置: 首页 > news >正文

Ksher H5页面支付实例指导 (PHP实现)

背景

  • 前两天,公司的项目,为了满足泰国客户的支付需求,要求使用 Ksher (开时支付)
    对接任务突然就给了鄙人,一脸懵 …
    通过了解客户的使用场景、以及参考官网指导
    发现:Ksher支付最令人满意的便是 —— 提供了便捷的 支付Demo
    在此,做下梳理,希望能对小伙伴有所帮助,欢迎指摘 …

  • 简单介绍

  Ksher 成立于2016年,由红杉资本和Infinity投资,在11个国家设立运营公司,聚焦东南亚,为全球150,000+ 企业提供支付服务。ksher专注东南亚市场、深耕出口卖家生态,帮助中国卖家安全、高效、便捷地处理东南亚电商结算货款

  • 官方文档

【API 开发文档 >>>】
【SDK Support >>> 】 (满足Java、Python、Go、PHP、Netcore、NodeJs)


☛ 开发步骤

当前的需求,是要满足 在手机H5页面,能在商品下单后,弹出支付二维码 (promptPay、trueMoney、card、wechat) 引导去支付

①. 确认支付场景,选取参考代码

  • 以我的场景需求和实际操作,想实现 H5页面的 Ksher支付,
    那么参考 【PHP - SDK Demo >>>】 中的 gateway_pay(WebSite) 这一部分即可

  • demo 演示页面如下:

②. 代码整合SDK

以我使用的 Yii2 框架 为例,将 php-sdk 文件放在了 common目录

  • 在提取使用时,其实就是对 ksher_pay_sdk.php 文件的 KsherPay类的使用
    为了避免直接改动 sdk 文件(方便出错排查),
    我复制了一份 ksher_pay_sdk文件,稍作个文件名和命名空间变动即可:

③. 实现下单流程

提取核心 下单逻辑代码

    /*** @Notes:处理获取 Ksher支付数据 (gateway_pay 方式)* @param string $ksher_pay_order_sn	唯一的订单编号* @param int $ksher_sum_pay_amount		订单金额,例:25.50* @return array* @User: zhanghj* @DateTime: 2023-12-22 11:57*/public function dealGetKsherGatewayPayData($ksher_pay_order_sn = '',$ksher_sum_pay_amount = 0){$err_msg = '';$ksher_data = [];$ks_appid = PayMzConfig::KSHER_APP_ID;$ks_privatekey = PayMzConfig::KSHER_PRIVATE_KEY;$class = new KsherPay($ks_appid,$ks_privatekey);$gateway_pay_data = array('mch_order_no' => $ksher_pay_order_sn,"total_fee" => round($ksher_sum_pay_amount, 2) * 100,"fee_type" => 'THB',    //默认为泰铢"channel_list" => 'promptpay,truemoney,card,wechat',   //支付方式 wechat'mch_code' => $ksher_pay_order_sn,'mch_redirect_url' => 'http://www.ksher.cn','mch_redirect_url_fail' => 'http://www.ksher.cn','product_name' => PayMzConfig::KSHER_SHOW_PAY_PRODUCT_NAME,'refer_url' => 'http://www.ksher.cn',"mch_notify_url" => PayMzConfig::KSHER_H5_ORDER_PAY_NOTIFY,'device' => 'H5' //H5(手机端)、PC(电脑端));$gateway_pay_response = $class->gateway_pay($gateway_pay_data);$gateway_pay_array = json_decode($gateway_pay_response, true);if (isset($gateway_pay_array['data']['pay_content'])) {$ksher_data['pay_link'] = $gateway_pay_array['data']['pay_content']??'';}else{$failed_msg = $gateway_pay_array['msg']??'';$failed_message = $gateway_pay_array['message']??'';$failed_message = empty($failed_message)?(LanguageMz::CHECK_KSHER_PAY_AWAKE_FAILED):$failed_message;$err_msg = $failed_msg?$failed_msg:$failed_message;}return [$err_msg,$ksher_data];}
  • 重点是得到上面的 pay_link 数据,整理反馈给前端数据形式如下:
{"code": 200,"msg": "操作成功","data": {"pay_link": "https://gateway.ksher.com/h5?order_uuid=074ad88ca3c911ee9148525400962f26&lang=en"}
}

④. 实现效果

点击前面成功生成的支付链接,会直接跳转到 Ksher 支付唤醒页面,如下为H5页面

  • 提示: 测试发现,如果手机端使用微信打开,会默认唤醒微信支付界面,同时支付金额自动由泰铢转化为人民币

⑤. 支付回调处理

  • 根据业务功能,整理支付回调接口,处理如下:
    /*** @Notes:Ksher H5订单支付回调接口 (正式)* @User: zhanghj* @DateTime: 2023-12-22 11:46*/public function actionKsherH5OrderNotify(){//1.接收参数$input = file_get_contents("php://input");$query = urldecode($input);if( !$query){CommonMzService::recordLocalFileLog('ksher_pay',"NO RETURN DATA" );echo json_encode(array('result'=>'FAIL',"msg"=>'NO RETURN DATA'));exit;}//2.验证参数$data_array = json_decode($query,true);CommonMzService::recordLocalFileLog('ksher_pay',"notify data :".json_encode( $data_array) );if( !isset( $data_array['data']) || !isset( $data_array['data']['mch_order_no']) || !$data_array['data']['mch_order_no']){echo json_encode(array('result'=>'FAIL',"msg"=>'RETURN DATA ERROR'));exit;}//3.处理订单if( array_key_exists("code", $data_array)&& array_key_exists("sign", $data_array)&& array_key_exists("data", $data_array)&& array_key_exists("result", $data_array['data'])&& $data_array['data']["result"] == "SUCCESS"){$ks_appid = PayMzConfig::KSHER_APP_ID;$ks_privatekey = PayMzConfig::KSHER_PRIVATE_KEY;$class = new KsherPay($ks_appid,$ks_privatekey);//3.1验证签名$verify_sign = $class->verify_ksher_sign($data_array['data'], $data_array['sign']);if( $verify_sign==1 ){//更新订单信息 change order status$pay_order_sn = $data_array['data']['mch_order_no'];$channel = $data_array['data']['channel']??'';$total_fee = $data_array['data']['total_fee']??'';$payment_json_str = json_encode($data_array,JSON_UNESCAPED_UNICODE);//TODO 此处为我的业务处理,可根据自己的业务,替换更新 ...(new PayMzService())->dealUpdateKsherGatewayPayOrder($pay_order_sn,$payment_json_str,$channel,$total_fee);echo json_encode(array('result'=>'SUCCESS',"msg"=>'OK'));} else {CommonMzService::recordLocalFileLog('ksher_pay','VERIFY_KSHER_SIGN_FAIL');echo json_encode(array('result'=>'Fail',"msg"=>'VERIFY_KSHER_SIGN_FAIL'));}}}

附录

    1. 为什么 手机端的 H5 页面支付场景会是 显示支付二维码?
  通过了解,泰国常用的APP并非微信、支付宝,他们常用的支付APP 为 promptPay、trueMoney、VISA 等在H5页面,可以截图需要支付的二维码,打开支付APP,进行识别支付即可个人感觉,没有微信(国内)和支付宝使用方便
    1. 源代码中,提到的 PayMzConfig 为支付配置类,方便后期对 Ksher 支付配置信息的改动
      摘取部分代码如下:
<?php
namespace common\enum;
/*** Mz 专用开发配置* Class PayMzConfig* @package common\enum*/
class PayMzConfig {//=================Ksher支付配置=============const KSHER_APP_ID = 'mch4XXXX';    //应用ID//私钥const KSHER_PRIVATE_KEY = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIICYAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXGk34+n
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
u9UlGXXXXXXXXXXXXXXXXXXXXXXXXXXXXp9xJa
-----END RSA PRIVATE KEY-----
EOD;const KSHER_SHOW_PAY_PRODUCT_NAME = 'HWAPPU-Water';//TODO 单前为测试用,后期配置新的H5api域名,更改为: /callz/ksher_h5_order_notifyconst KSHER_H5_ORDER_PAY_NOTIFY = 'http://clientapi.water.com/notify/ksher_h5_order_notify';
}
    1. 对于支付回调接口中提到的recordLocalFileLog()方法,可根据自己的代码,放在合适位置
    /*** @Notes:记录本地文件 日志信息* @param string $op_type* @param string $log_content* @return bool* @User: zhanghj* @DateTime: 2023-12-22 13:59*/public static function recordLocalFileLog($op_type = '',$log_content = '') {$time_stamp = date("Y-m-d H:i:s", time());if( !$log_content ) return false;if ($op_type == 'ksher_pay'){$log_file_name = 'ksher_pay';}else{$log_file_name = 'mz';}$file = dirname(Yii::$app->basePath)."/api/log/{$log_file_name}_".date("Ymd").".txt";$handle = fopen( $file, 'a+');fwrite( $handle , "[{$time_stamp}]: ".$log_content."\r");fclose( $handle );}

相关文章:

Ksher H5页面支付实例指导 (PHP实现)

背景 前两天&#xff0c;公司的项目&#xff0c;为了满足泰国客户的支付需求&#xff0c;要求使用 Ksher (开时支付) 对接任务突然就给了鄙人&#xff0c;一脸懵 … 通过了解客户的使用场景、以及参考官网指导 发现&#xff1a;Ksher支付最令人满意的便是 —— 提供了便捷的 支…...

https密钥认证、上传镜像实验

一、第一台主机通过https密钥对认证 1、安装docker服务 &#xff08;1&#xff09;安装环境依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 &#xff08;2&#xff09;设置阿里云镜像源 yum-config-manager --add-repo http://mirrors.aliyun.com/do…...

three.js使用精灵模型Sprite渲染森林

效果&#xff1a; 源码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right&quo…...

什么是数据可视化?数据可视化的流程与步骤

前言 数据可视化将大大小小的数据集转化为更容易被人脑理解和处理的视觉效果。可视化在我们的日常生活中非常普遍&#xff0c;但它们通常以众所周知的图表和图形的形式出现。正确的数据可视化以有意义和直观的方式为复杂的数据集提供关键的见解。 数据可视化定义 数据可视化…...

2022年山东省职业院校技能大赛高职组云计算赛项试卷第二场-容器云

2022年山东省职业院校技能大赛高职组云计算赛项试卷 目录 【赛程名称】云计算赛项第二场-容器云 需要竞赛软件包以及资料可以私信博主&#xff01; 【赛程名称】云计算赛项第二场-容器云 【赛程时间】2022-11-27 09:00:00至2022-11-27 16:00:00 说明&#xff1a;完成本任务…...

Unity3D 中播放 RTSP 监控视频

【Unity 3D】怎么在 WebGL 中低延迟播放 RTSP 监控 - 简书[Unity 3D] 开箱即食的头部监控厂商 SDK 集成框架 - 简书 Unity3d Windows播放视频&#xff08;视频流&#xff09;功能组/插件支持对比_ffmpeg for unity-CSDN博客Unity UMP打包黑屏问题总结-CSDN博客Unity Universal…...

[spark] DataFrame 的 checkpoint

在 Apache Spark 中&#xff0c;DataFrame 的 checkpoint 方法用于强制执行一个物理计划并将结果缓存到分布式文件系统&#xff0c;以防止在计算过程中临时数据丢失。这对于长时间运行的计算过程或复杂的转换操作是有用的。 具体来说&#xff0c;checkpoint 方法执行以下操作&…...

flask文件夹列表改进版--Bug追踪

把当前文件夹下的所有文件夹和文件列出来&#xff0c;允许点击返回上层目录&#xff0c;允许点击文件夹进入下级目录并显示此文件夹内容 允许点击文件进行下载 from flask import Flask, render_template, send_file, request, redirect, url_for import osapp Flask(__name_…...

Elasticsearch之常用DSL语句

目录 1. Elasticsearch之常用DSL语句 1.1 操作索引 1.2 文档操作 1.3 DSL查询 1.4 搜索结果处理 1.5 数据聚合 1. Elasticsearch之常用DSL语句 1.1 操作索引 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; - type&#xff1a;字段数据类…...

鸿蒙实战-库的调用(ArkTS)

整体框架搭建 主页面、本地库组件页面、社区库组件页面三个页面组成&#xff0c;主页面由Navigation作为根组件实现全局标题&#xff0c;由Tabs组件实现本地库和社区库页面的切换。 // MainPage.ets import { Outer } from ../view/OuterComponent; import { Inner } from ..…...

观察者模式学习

观察者模式&#xff08;Observer Design Pattern&#xff09;也被称为发布订阅模式&#xff08;Publish-Subscribe Design Pattern&#xff09;。在 GoF 的《设计模式》一书中&#xff0c;它的定义是这样的&#xff1a; Define a one-to-many dependency between objects so th…...

人工智能_机器学习078_聚类算法_概念介绍_聚类升维_降维_各类聚类算法_有监督机器学习_无监督机器学习---人工智能工作笔记0118

首先看一下什么是聚类,我们可以进入sklearn的官网去看看 可以看到这里,首先classification 这个分类我们学完了,然后就是regression回归我们也学完了对吧,其实我们现实生活中的,大部分问题就是 这两种问题就可以解决了. 然后我们再来看一个: clustering,这个就是聚类对吧.聚类算…...

基于AR+地图导航的景区智慧导览设计

随着科技的飞速发展&#xff0c;智慧旅游已经成为现代旅游业的一个重要趋势。在这个背景下&#xff0c;景区智慧导览作为智慧旅游的核心组成部分&#xff0c;正逐渐受到越来越多游客的青睐。本文将深入探讨地图导航软件在景区智慧导览中的应用&#xff0c;并分析其为游客和景区…...

git基本指令

下载代码 git clone http://.......设置分支 git checkout 分支名查询当前分支 git checkout打开终端或命令行窗口&#xff0c;进入你要操作的项目目录&#xff0c;执行以下命令&#xff0c;列出所有的分支&#xff0c;这会列出当前代码仓库中的所有分支&#xff0c;用带星号…...

ECMAScript基础入门

ECMAScript&#xff08;简称ES&#xff09;是一种标准化了的高级编程语言&#xff0c;它是JavaScript语言的标准化版本&#xff0c;由Ecma International组织发布。ECMAScript描述了JavaScript的语法和核心特性&#xff0c;而JavaScript是实现ECMAScript标准的编程语言。随着We…...

神经网络介绍

目录 知识点介绍 知识点介绍 前馈神经网络&#xff1a;&#xff08;前馈网络的数据只向一个方向传播&#xff09; RNN循环神经网络&#xff0c;下图中多个 RNN 层都是“同一个层”&#xff0c;这一点与之前的神经网络是不一样的。...

CPU亲和性和NUMA架构

何为CPU的亲和性 CPU的亲和性&#xff0c;进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性&#xff0c;进程迁移的频率小就意味着产生的负载小。亲和性一词是从affinity翻译来的&#xff0c;实际可以称为CPU绑定。 在多核运行的机器上&#xff0c;…...

目标检测-Two Stage-Fast RCNN

文章目录 前言一、Fast RCNN的网络结构和流程二、Fast RCNN的创新点1.特征提取分类回归合一2.更快的训练策略 总结 前言 前文目标检测-Two Stage-SPP Net中提到SPP Net的主要缺点是&#xff1a; 分开训练多个模型困难且复杂尽管比RCNN快10-100倍&#xff0c;但仍然很慢SPP Ne…...

vol----随记!!!

目录 一、代码生成1.先新建一个功能的对应的代码配置各项解释&#xff1a; 2.后设置配置菜单3.再点保存&#xff0c;生成vue页面&#xff0c;生成model&#xff0c;生成业务类4.再通过菜单设置编写系统菜单 一、代码生成 1.先新建一个功能的对应的代码配置 各项解释&#xff…...

vue中样式动态绑定写法

绑定样式: class样式 写法:class"xxx"xXX可以是字符串、对象、数组。 字符串写法适用于:类名不确定&#xff0c;要动态获取。 对象写法适用于:要绑定多个样式,个数不确定&#xff0c;名字也不确定。 数组写法适用于:要绑定多个样式&#xff0c;个数确定&#xff0c;…...

NVIDIA突破:单显卡实现图片驱动720p长视频世界模型生成能力提升

这项由NVIDIA研究团队主导的研究成果于2026年5月以预印本形式发布&#xff0c;论文编号为arXiv:2605.15178&#xff0c;感兴趣的读者可通过该编号查阅完整原文。给你一张照片&#xff0c;再给你一条摄像机的移动路线&#xff0c;然后电脑自动生成一段完整的一分钟高清视频&…...

2026AI论文写作工具实测排行榜!这几款才是真神器

综合评分 TOP4 为千笔AI(99/100)、毕业之家 (96/100)、DeepSeek Scholar(89/100)、豆包学术版 (88/100)。千笔AI是全流程全能王&#xff0c;毕业之家专注学术合规&#xff0c;DeepSeek 是理工科免费神器&#xff0c;豆包擅长多模态与文献分析。一、测评标准说明&#xff08;202…...

告别繁琐操作:用VSCode插件‘Open in Browser’和‘CSS Peek’打造流畅的实时预览调试工作流

极速开发实战&#xff1a;VSCode插件组合拳实现HTML/CSS无缝调试 每次修改完CSS样式都要手动切换到浏览器刷新页面&#xff1f;在庞大的代码库中寻找某个CSS定义像大海捞针&#xff1f;这些问题困扰着无数前端开发者。今天我们将解锁VSCode中两个看似简单却威力巨大的插件——O…...

泛微发布300+可落地AI应用 让组织业务数智升级

5月20日&#xff0c;泛微300AI应用场景体验大会在上海举办。大会以“组织的AI范式数字员工与业务流程AI新生”为主题&#xff0c; 展示泛微全场景AI应用。泛微搭载五大智能引擎&#xff0c;提供300可快速落地的AI应用场景&#xff0c;覆盖市场、销售、项目、合同、采购、财务、…...

泥沙自动监测仪:从“估算”到“实测”,水保验收不再凭感觉

泥沙自动监测仪搭载一体化智能监测架构&#xff0c;聚焦水保监测核心指标&#xff0c;可全天候无人值守自动采集关键数据&#xff0c;精准监测径流量、实时径流含沙量、阶段性径流总量三大核心参数&#xff0c;全面覆盖水土保持监测刚需指标。区别于人工定时取样的片面性&#…...

十大榜单全覆盖,价值兑现引领:联想定义中国AI企业新高度

当前&#xff0c;全球 AI 产业已正式迈入规模化商业落地的关键周期&#xff0c;“技术炫技”让位于“价值兑现”&#xff0c;“算力筑基—技术创新—场景落地”的协同闭环成为高质量发展的核心逻辑。据《全球首席信息官&#xff08;CIO&#xff09;报告&#xff1a;企业级 AI 竞…...

MCP电路设计:从门电路到CPLD的优先级仲裁硬件实现

1. 项目概述&#xff1a;从“命令打架”到“有序排队”的电路设计在嵌入式系统、工业控制或者任何需要处理多路信号的数字电路里&#xff0c;我们经常会遇到一个头疼的问题&#xff1a;当多个输入信号同时要求一个输出设备执行不同动作时&#xff0c;系统该听谁的&#xff1f;比…...

10分钟搭建企业级网络流量监控系统:ElastiFlow实战指南

10分钟搭建企业级网络流量监控系统&#xff1a;ElastiFlow实战指南 【免费下载链接】elastiflow Network flow analytics (Netflow, sFlow and IPFIX) with the Elastic Stack 项目地址: https://gitcode.com/gh_mirrors/el/elastiflow 在当今复杂的网络环境中&#xff…...

OpenClaw Windows一键部署包简体中文版下载

OpenClaw&#xff08;小龙虾&#xff09;Windows 一键部署保姆级教程 | 10分钟养出你的数字员工&#xff08;2026最新版&#xff09; 前言&#xff1a;2026年爆火的开源AI智能体OpenClaw&#xff08;昵称小龙虾&#xff09;&#xff0c;GitHub星标超28万&#xff0c;凭“本地运…...

从登录页到仪表盘:手把手教你为Vue2+Element后台管理系统添加中英文切换

从登录页到仪表盘&#xff1a;Vue2Element后台管理系统国际化实战指南 当产品经理突然要求为已有后台管理系统添加多语言支持时&#xff0c;许多开发者会陷入手忙脚乱的境地。本文将分享一套经过实战检验的国际化方案&#xff0c;不仅能快速实现基础功能&#xff0c;还能解决那…...