微信支付开发-支付工厂JsApi产品代码

一、JSAPI支付产品、APP支付产品、小程序支付产品流程图

二、H5支付产品、Native支付产品

三、工厂父类抽象类代码开发

<?php
/*** 微信父类抽象类* User: 龙哥·三年风水* Date: 2024/9/19* Time: 11:33*/
namespace Payment\WechatPay;
abstract class WechatPaymentHandle
{/*** 下单* User: 龙哥·三年风水* Date: 2024/9/19* Time: 11:36* @ return mixed*/protected abstract function pay();/*** 查询* User: 龙哥·三年风水* Date: 2024/9/19* Time: 11:39* @ param $transactionId 原支付交易对应的微信订单号* @ return mixed*/protected abstract function transac($transactionId);/*** 退款* User: 龙哥·三年风水* Date: 2024/9/19* Time: 11:42* @ param $outRefundNo 退款单号* @ param $amount 退款额* @ param string $notifyUrl 异步通知地址* @ param string $transactionId 原支付交易对应的微信订单号,与$outTradeNo二选一* @ param string $outTradeNo 原支付交易对应的商户订单号,与$transactionId二选一* @ return mixed*/protected abstract function refunds($outRefundNo,$amount,$notifyUrl ='',$transactionId = '',$outTradeNo = '');
}

四、工厂通道选择类代码开发

<?php
/*** 微信支付工厂通道选择类* User: 龙哥·三年风水* Date: 2024/9/19* Time: 11:47*/
namespace Payment\WechatPay;
use app\BaseError;
use Payment\WechatPay\impl\JsApi;
class WechatPaymentFactory
{protected static $instance = null;//缓存实例protected $merchantId = null;// 商户号protected $merchantSerialNumber = null;// 商户API证书序列号protected $appid = null;// 公众号IDprotected $merchantPrivateKey = null;// 商户私钥protected $channelType = 0;//通道类型/*** 初始化资源*/public function __construct($type){$this->merchantId = config('pay.wechat.merchant_id');$this->appid = config('pay.wechat.app_id');$this->merchantSerialNumber = config('pay.wechat.merchant_serial_number');$file = file_get_contents('./wechatpay/apiclient_key.pem');$this->merchantPrivateKey = openssl_get_privatekey($file);// 读取商户秘钥self::$instance = null;$this->channelType = $type;}/*** 通道选择* User: 龙哥·三年风水* Date: 2024/9/19* Time: 14:34* @ param $url* @ param $data* @ return null|JsApi*/public function sendWechatPaymentHandle($url,$data){switch ((int)$this->channelType){case 1:$data['appid'] = $this->appid;$data['mchid'] = $this->merchantId;$authorization = $this->getSign($url,$data);self::$instance = new JsApi($url,$authorization,$data);break;case 2:break;case 3:break;case 4:break;case 5:break;default:self::$instance = null;throw new BaseError("未设置任何通道",50000,200);break;}return self::$instance;}/*** 生成签名* User: 龙哥·三年风水* Date: 2024/9/19* Time: 14:01* @ param $url* @ param $data* @ return string*/protected function getSign($url,$data){$timestamp = time();$nonce = alnum(12).date('YmdHis', $timestamp) . rand(1000, 9999);$url_parts = parse_url($url);$canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));$data = json_encode($data);$message = 'POST' . "\n" .$canonical_url . "\n" .$timestamp . "\n" .$nonce . "\n" .$data . "\n";openssl_sign($message, $signature, $this->merchantPrivateKey, "sha256WithRSAEncryption");$sign = base64_encode($signature);$schema = 'WECHATPAY2-SHA256-RSA2048';$token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',  $this->merchantId, $nonce, $timestamp, $this->merchantSerialNumber, $sign);return "Authorization: " . $schema . " " . $token;}/***销毁资源*/public function __destruct(){$this->merchantId = null;$this->appid = null;$this->merchantSerialNumber = null;$this->merchantPrivateKey = null;self::$instance = null;}
}

五、JsApi支付产品代码开发

<?php
/*** jsapi支付方式* User: 龙哥·三年风水* Date: 2024/9/19* Time: 14:12*/
namespace Payment\WechatPay\impl;
use Payment\WechatPay\WechatPaymentHandle;
use app\BaseError;
class JsApi extends WechatPaymentHandle
{protected $url = ''; //访问路径protected $header = ''; //头文件protected $data = []; //数据组/*** 初始化* @ param $url* @ param $header* @ param $data*/public function __construct($url,$header,$data){$this->url = $url;$this->header = $header;$this->data = $data;}/*** 下单* User: 龙哥·三年风水* Date: 2024/9/19* Time: 11:36* @ return mixed*/public function pay(){$res = http_post($this->url, $this->header, $this->data);$arr = json_decode($res, true);if(isset($arr['code'])) {$error['code'] = $arr['code'];$error['message'] = $arr['message'];$error['timestamp'] = time();$error['ip'] = get_client_ip();file_put_contents('native_pay.txt', json_encode($error) . PHP_EOL, FILE_APPEND);throw new BaseError($arr['message'], 50000, 200);}return $arr;}/*** 查询* User: 龙哥·三年风水* Date: 2024/9/19* Time: 11:39* @ param $transactionId 原支付交易对应的微信订单号* @ return mixed*/public function transac($transactionId){// TODO: Implement transac() method.}/*** 退款* User: 龙哥·三年风水* Date: 2024/9/19* Time: 11:42* @ param $outRefundNo 退款单号* @ param $amount 退款额* @ param string $notifyUrl 异步通知地址* @ param string $transactionId 原支付交易对应的微信订单号,与$outTradeNo二选一* @ param string $outTradeNo 原支付交易对应的商户订单号,与$transactionId二选一* @ return mixed*/public function refunds($outRefundNo, $amount, $notifyUrl = '', $transactionId = '', $outTradeNo = ''){// TODO: Implement refunds() method.}/****/public function __destruct(){$this->url = '';$this->header = '';$this->data = [];}
}

六、测试调用

public function index(){//定义参数$data['description'] = '运费钱';$data['out_trade_no'] = create_order();$data['time_expire'] = date('Y-m-d\TH:i:s\+08:00',time()+3600);$data['notify_url'] = 'http://www.baidu.com';$data['amount'] = ['total'     =>  100,'currency'  =>  'CNY'];$data['payer']  =   ['openid'    =>  'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o'];// 初始化通道$wechatPaymentFactory = new WechatPaymentFactory(1);// 选择实例$wechatPaymentHandle = $wechatPaymentFactory->sendWechatPaymentHandle('https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi',$data);$res = $wechatPaymentHandle->pay();var_dump($res);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1539188.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

翻页时钟 2.0-自动置顶显示,点击小时切换显示标题栏不显示标题栏-供大家学习研究参考

更新内容 自动置顶显示点击小时切换显示标题栏&#xff0c;&#xff08;显示标题栏后可移动时钟位置&#xff0c;鼠标拖动边框调整时钟大小&#xff09;不显示标题栏时&#xff0c;透明部分光标可穿透修正一个显示bu 下载地址&#xff1a; https://download.csdn.net/download…

一站式项目管理系统如何实现全链条数字化管理?

在当今数字化高速发展的时代&#xff0c;项目申报领域也面临着管理方式的革新挑战。从传统的人工管理到如今追求高效、精准的数字化管理模式转变&#xff0c;是行业发展的必然趋势。如启服云项目管理系统之类的出现&#xff0c;为项目申报管理带来了新的思路。 立项阶段的数字化…

假期学习笔记总结--iOS 自动释放池

iOS 自动释放池 https://juejin.cn/post/6844904094503567368#heading-23 ARC和MRC 苹果在 iOS 5 中引入了ARC&#xff08;Automatic Reference Counting&#xff09;自动引用计数内存管理技术&#xff0c;通过LLVM编译器和Runtime协作来进行自动管理内存。LLVM编译器会在编…

怎么把图片压缩变小?把图片压缩变小的八种压缩方法介绍

怎么把图片压缩变小&#xff1f;在当今这个信息高度共享的时代&#xff0c;图片不仅仅是简单的视觉元素&#xff0c;它们承载着我们的记忆、故事和创意。无论是旅行的风景、家庭的聚会&#xff0c;还是工作中的项目展示&#xff0c;图片都在我们的生活中扮演着不可或缺的角色。…

文达通从创业板、北交所转战港股:净利润下滑,资产负债率124%

《港湾商业观察》施子夫 8月13日&#xff0c;青岛文达通科技股份有限公司&#xff08;以下简称&#xff0c;文达通&#xff09;递表港交所获受理&#xff0c;联席保荐机构为山证国际、浤博资本。 在选择递表港交所前&#xff0c;文达通曾于新三板挂牌上市并且还曾尝试谋求创业…

智谱清影 -CogVideoX-2b-部署与使用,带你揭秘生成6s视频的极致体验!

文章目录 1 效果展示2 CogVideoX 前世今生3 CogVideoX 部署实践流程3.1 创建丹摩实例3.2 配置环境和依赖3.3 模型与配置文件3.4 运行4 遇到问题 1 效果展示 A street artist, clad in a worn-out denim jacket and a colorful bandana, stands before a vast concrete wall in …

产品:直播送礼延迟这么大,你就不能快点吗

先赞后看&#xff0c;南哥助你Java进阶一大半 其实抖音的实时音视频技术RTC&#xff0c;是来源于火山引擎RTC的支持&#xff0c;抖音、火山引擎、巨量引擎都属于字节旗下不同的业务板块。 我是南哥&#xff0c;一个Java学习与进阶的领路人。 相信对你通关面试、拿下Offer进入心…

俄罗斯电商Ozon实用运营工具推荐

想要在俄罗斯最大的跨境电商平台 Ozon 上大展拳脚&#xff0c;却对俄语感到无从下手&#xff1f;又或是担心难以把握俄罗斯市场的热点趋势&#xff1f;别担心&#xff01;在这篇文章中&#xff0c;我们将为你介绍一系列实用工具&#xff0c;涵盖翻译、运营和图片处理等方面&…

有源滤波器UAF42

有源滤波器模块&#xff0c;在电路板上同时实现了低通&#xff0c;高通&#xff0c;带通 滤波器&#xff0c;可选其一进行输出&#xff0c;并可通过改变滑变阻值&#xff0c;轻松调节其滤波器中心频率&#xff0c;Q值&#xff0c;通带增益等&#xff0c; 也可方便实现Butterwo…

深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 这次目标本来要达到60%&#xff0c;但是却非常稳定的达到了40%&#xff0c;​&#x1f622;​​&#x1f622;​​&#x1f622;​​&#x1f622;​&am…

实战17-NavBar+Vip布局

NavBar.ets import { PADDING } from ../../constants/size import rvp from ../../utils/resposive/rvIndexComponent export default struct NavBar {StorageProp(topHeight) topHeight: number 0;build() {Row() {Row({ space: rvp(6) }) {Text(请选择地址).fontSize(rvp(1…

Java-测试-Mockito 入门篇

之前很长一段时间我都认为测试就是使用SpringBootTest类似下面的写法&#xff1a; SpringBootTest class SysAuthServiceTest {AutowiredSysRoleAuthMapper sysRoleAuthMapper;Testpublic void test() {QueryWrapper<SysRoleAuth> queryWrapper new QueryWrapper<&g…

Web开发:Thymeleaf模板引擎

1. Thymeleaf 简介 Thymeleaf 是一个现代的服务器端模板引擎&#xff0c;用于生成 HTML、XML、JavaScript 和 CSS。它的设计理念是使模板能够自然地在 Web 浏览器中呈现&#xff0c;同时允许动态生成内容。 2. 最佳实践总结 2.1 项目结构和模板组织 保持清晰的目录结构&…

Electron-vue asar 局部打包优化处理方案——绕开每次npm run build 超级慢的打包问题

背景 因为组员对于 Electron 打包过程存在比较迷糊的状态&#xff0c;且自己也没主动探索 Electron-vue 打包细节&#xff0c;导致每次打包过程都消耗 5-6 分钟的时间&#xff0c;在需要测试生产打包时&#xff0c;极其浪费时间&#xff0c;为此针对 Electron-vue 打包的几个环…

C++ —— 关于vector

目录 链接 1. vector的定义 2. vector的构造 3. vector 的遍历 4. vector 的扩容机制 5. vector 的空间接口 5.1 resize 接口 5.2 push_back 5.3 insert 5.4 erase 5.5 流插入与流提取 vector 并不支持流插入与流提取&#xff0c;但是可以自己设计&#xff0c;更…

MSF的使用学习

一、更新MSF apt update # 更新安装包信息&#xff1b;只检查&#xff0c;不更新&#xff08;已安装的软件包是否有可用的更新&#xff0c;给出汇总报告&#xff09; apt upgrade # 更新已安装的软件包&#xff0c;不删除旧包&#xff1b; apt full-upgrade # 升级包&#x…

深度学习-18-深入理解BERT实战使用预训练的DistilBERT模型

文章目录 1 预训练的BERT模型2.1 单词级的嵌入表示2.2 句子级的嵌入表示2.3 从最顶层编码器层中抽取嵌入表示2.3.1 预处理输入2.3.2 获得嵌入表示2.4 从所有的编码器层中抽取嵌入表示2.4.1 预处理输入2.4.2 嵌入表示3 为下游任务微调BERT3.1 文本分类3.1.1 原理(微调BERT模型)3…

MTK芯片机型的“工程固件” 红米note9 5G版资源预览 写入以及改写参数相关步骤解析

小米机型:小米5 小米5x 米6 米6x 米8 米9 米10系列 米11系列 米12系列 mix mix2 mix2s mix3 max max2 max3 note3 8se 9se cc9系列 米play 平板系列等分享 红米机型:红米note4 红米note4x 红米note5 红米note6 红米note7 红米note8 红米note8pro 红米s2 红米note7pro 红米…

大数据概念与价值

文章目录 引言大数据的概念高德纳咨询公司的定义麦肯锡全球研究所的定义什么是大数据&#xff1f; 大数据的特征Volume&#xff08;体积&#xff09;Variety&#xff08;种类&#xff09;Velocity&#xff08;速度&#xff09;Value&#xff08;价值&#xff09;Veracity&#…

OpenCV 1

前言&#xff1a;开新坑辽&#xff0c;&#xff0c; 目录 计算机眼中的图像 视频的读取与处理 ROI区域 边界填充 数值计算 腐蚀操作 膨胀操作 开运算与闭运算 梯度计算 礼貌与黑帽 Sobel算子 梯度计算方法 scharr与laplacian 计算机眼中的图像 灰色图片&#xff0…