记录一下PHP使用微信小程序支付

记录一下PHP使用微信小程序支付V3版本经历

官方文档:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_0.shtml

请详细查看文档中小程序支付接入前准备(https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml)

注意:配置好需要将已生成的证书下载放在自己的项目中
示例:
在这里插入图片描述

配置好后需要拿到以下参数:

  1. 小程序appid
  2. 商户号
  3. 微信支付API证书序列号
  4. 微信支付v3密钥(回调时需要)

支付大概流程:
1.小程序端提交订单

小程序端提交的订单就不做示例了

2.后端根据订单信息生成预订单通过小程序JSAPI下单返回预支付交易会话标识

	  private $appid = '**********';//应用IDprivate $mchid = '************';//商户号private $serial_number = '***********';//微信支付API证书序列号private $v3_key = '***********';//微信支付v3密钥public function placeOrder(){//通过jsapi下单所需参数$pay_info = ['out_trade_no' => '',//自己平台的订单号'total' => '',//付款金额,单位为分'openid' => '',//付款用户的openid];// 1、请求参数$postJson = ["appid" => $this->appid,"mchid" => $this->mchid,"description" => '商品信息',//商品信息"out_trade_no" => $pay_info['out_trade_no'],//自己平台的订单号//用于接收微信支付结果的回调接口(注意回调接口不能加什么是否登录验证信息,需要外网能直接访问的地址)"notify_url" => 'https://ffe8-113-249-28-138.ngrok-free.app/api/Pay/payBack',"amount" => ["total" => $pay_info['total'] //付款金额,单位为分],"payer" => ["openid" => $pay_info['openid'],//付款用户的openid],];$time = time();// 2、头部签名$url = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi";$urlarr = parse_url($url);$data = json_encode($postJson);$noncestr = randstrpay();//签名所需随机字符串$key = $this->getSign($data, $urlarr['path'], $noncestr, $time);//签名//        $token = sprintf('mchid="%s",serial_no="%s",nonce_str="%s",timestamp="%d",signature="%s"', '商户号', '微信支付API证书序列号', $noncestr, $time, $key);//头部信息$token = sprintf('mchid="%s",serial_no="%s",nonce_str="%s",timestamp="%d",signature="%s"', $this->mchid, $this->serial_number, $noncestr, $time, $key);//头部信息$header = ['Content-Type:' . 'application/json; charset=UTF-8','Accept:application/json','User-Agent:*/*','Authorization: WECHATPAY2-SHA256-RSA2048 ' . $token];$resp = postCurl($url, $data, $header);$resp = json_decode($resp, true);if (isset($resp['prepay_id'])) {$return = ["appId" => $this->appid,"timeStamp" => $time,'prepay_id' => 'prepay_id=' . $resp['prepay_id'],'paySign' => $this->getWechartSign('wxf1edd999226319ea', $time, $noncestr, 'prepay_id=' . $resp['prepay_id']),//微信支付(小程序)签名"nonceStr" => $noncestr];return $return;} else {//apiReturn是我自己封装的返回的json格式apiReturn(303, '支付订单创建失败!', $resp);}}/***Api Name:生成微信支付签名*Developer:TH*Time:2024年05月30日 09:31*/public function getSign($data = [], $url, $randstr, $time){$str = "POST" . "\n" . $url . "\n" . $time . "\n" . $randstr . "\n" . $data . "\n";$key = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/apiclient_key.pem');//在商户平台下载的秘钥$str = $this->getSha256WithRSA($str, $key);return $str;}/***Api Name:调起支付的签名*Developer:TH*Time:2024年05月30日 09:32*/public function getWechartSign($appid, $timeStamp, $noncestr, $prepay_id){$str = $appid . "\n" . $timeStamp . "\n" . $noncestr . "\n" . $prepay_id . "\n";$key = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/apiclient_key.pem');$str = $this->getSha256WithRSA($str, $key);return $str;}public function getSha256WithRSA($content, $privateKey){$binary_signature = "";$algo = "SHA256";openssl_sign($content, $binary_signature, $privateKey, $algo);$sign = base64_encode($binary_signature);return $sign;}

JSAPI下单成功后会返回以下参数
在这里插入图片描述

3.小程序端根据预支付交易会话标识 调起支付API

小程序端示例:

		// 模拟支付pay: function() {wx.requestPayment({"timeStamp": "1718348859","nonceStr": "R5AK20MQQZIZFMAD170J2124CE6WLJ1J","package": "prepay_id=wx14150738126675942c8a76a8a13b8a0000","signType": "RSA","paySign": "q2ZVp5DUpYSxgUu5aCNrlLj7m81mL9GDMw0TE2EkYvqAI29/jFKP9FctE0f78S+qs1p3STaHKpOnHc6gy0K4FOW7CO8tER00FlNyxVYwhTOV0SsGwLaKV239iizt3iYVQS2VkfwdyH3mTn27PHyBdww1LvDLLlXdLCmdrcE4OM5VGemAHgJuPR0PcZC19ufweC8ALoKF/FHYra9uX3Rbph1LVeu6VpB2nCDO6fVR5TpY27cehJY7tGemar/f+9NAMvmgIZOpFps4kUNOV1wqcDjAkTJYIb5LmVdgiZbUwJYz9LCxvXEjXpsrj9VvTrwjyLc1Ifvj4JPzNlfIrf0fzw==","success":function(res){console.log(res);},"fail":function(res){},"complete":function(res){}})},

4.支付成功后通过第二步设置的回调地址进行支付成功后订单逻辑支付
示例:

    /***Api Name:支付回调结果处理*Developer:TH*Time:2024年06月14日 10:06*/public function payBack(){$xml = file_get_contents('php://input');//微信回调返回的结果$post = json_decode($xml, true);$text = base64_decode($post['resource']['ciphertext']);//对加密数据解密 注:sodium_crypto_aead_aes256gcm_decrypt需要你运行的PHP版本>=7.1$str = sodium_crypto_aead_aes256gcm_decrypt($text, $post['resource']['associated_data'], $post['resource']['nonce'], '微信支付v3密钥');$res = json_decode($str, true);if ($res['trade_state'] == 'SUCCESS') {//按照自己的需求,进行订单逻辑处理} else {apiReturn(303, '发生未知错误,请联系管理员处理');}}

小程序支付到这基本就算完成了,中途发生问题可以百度解决,实际请按自己的需求进行代码完善

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仿element-ui 实现自己组件库 <3>

目录 input 组件封装 v-model用在组件上 显示和隐藏密码 封装switch组件 实现转换的功能 设置checkbox input 组件封装 首先input组件的基本框架和样式&#xff1a; <div class"miao-input"><input class"miao-input_inner" > </div…

网络编程(四)

一、使用wireshark抓包分析协议头 &#xff08;一&#xff09;wireshark常用的过滤语句 tcp.port <想要查看的端口号> ip.src <想要查看的源IP地址> ip.dest <想要查看的目的IP地址> ip.addr <想要查看的IP地址>&#xff08;二&#xff09;抓包分…

Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描

Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接&#xff1a;Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描…

IP服务器代理如何设置使用?

IP服务器代理&#xff08;通常称为代理IP或代理服务器&#xff09;的设置和使用方法可以根据不同的需求和场景而有所不同。以下是一个清晰的步骤指南&#xff0c;帮助你设置和使用IP服务器代理&#xff1a; 1. 选择合适的代理IP类型 根据使用目的的不同&#xff0c;可以选择不…

如何将ai集成到项目中,方法二

上一篇文章&#xff1a;如何将ai集成到radsystems项目中&#xff0c;在项目中引入ai-CSDN博客 上一篇文章内容主要针对于未实现权限分离的项目&#xff0c;这篇文章主要来说一下权限分离的项目怎么做&#xff0c;以及注意的细节。 一、编写前端router.js 二、编写前端askai.vu…

基础-02-数据通信基础

文章目录 1.信道特征1.1 数据通信概念1.2 信道特性-信道带宽W1.3 信道特性-码元和码元速率1.4 信道特性-奈奎斯特定理1.5 信道特性-香农定理1.6 带宽/码元速率/数据速率关系梳理1.7 练习题 2.信道延迟2.1 信道延迟概念2.2 信道延迟计算2.3 练习题 3. 传输介质3.1 传输介质概念3…

4/8路 HDD/SSD 1080 车载NVR,高清车载录像机(8路1080P硬盘机

4/8路 HDD/SSD 1080 车载NVR 产品主要特点&#xff1a; -支持4/8路实时高清数字 1080P录像 -硬盘记录数据&#xff08;最大支持2TB&#xff09; -支持GPS全球定位, 可选模块 -支持WIFI高速自动下载功能, 可选模块 -内置3/4G模块&#xff0c;实时预览和远程管理&#xff0c…

浏览器实时播放摄像头数据并通过 Yolo 进行图像识别

安装 Ultralytics 之后&#xff0c;可以直接通过本地获取摄像头数据流&#xff0c;并通过 Yolo 模型实时进行识别。大多情况下&#xff0c;安装本地程序成本比较高&#xff0c;需要编译打包等等操作&#xff0c;如果可以直接通过浏览器显示视频&#xff0c;并实时显示识别到的对…

汇编中标签的引用$符号

一个c/c开发人员&#xff0c;居然不会汇编&#xff0c;真是惭愧。趁着闲暇时间学习一下汇编&#xff0c;曲不离口&#xff0c;码不离手。看一个简单的例子&#xff1a; .section .datavalue:.quad 200.section .text .global main main:nopMOVL value, %eaxret 就这一条指令&…

计算机网络:网络层 - IPv4地址

计算机网络&#xff1a;网络层 - IPv4地址 分类编址划分子网子网掩码 无分类编址 CIDRCIDR 地址块构造超网 在酒店中&#xff0c;每个房间都有门牌号码&#xff0c;服务员送餐时&#xff0c;就可以根据门牌号码来判断一份餐要送到那个房间。 在网络中也是如此&#xff0c;一份…

订单排队模式 :强复购,无库存担忧

库存积压&#xff0c;意味着资金的束缚和机会的错失&#xff1b;库存不足&#xff0c;又可能导致客户流失和市场机会的丧失。订单排队模式的核心理念是通过排队出局奖励、直推优先和代理商等机制&#xff0c;激发消费者的购买热情&#xff0c;同时确保库存的流动性和销售的增长…

八字综合测算网整站源码程序/黄历/灵签/排盘/算命/生肖星座/日历网/周公解梦

八字综合测算网整站源码程序/黄历/灵签/排盘/算命/生肖星座/日历网/周公解梦 演示地址&#xff1a; https://s24.gvyun.com/ 手机端地址&#xff1a; https://ms24.gvyun.com/ 网站功能分类&#xff1a; 八字&#xff1a;八字测算&#xff1b;日干论命&#xff1b;称骨论命…

ERP管理系统解决方案(附ERP流程和详细解决方法)

ERP 是专门为制造企业设计的综合性管理解决方案&#xff0c;旨在优化制造业务流程&#xff0c;整合各个部门和环节&#xff0c;实现生产、供应链、质量控制和销售等方面的高效协同。 传统的制造行业会面临哪些业务痛点&#xff0c;会考虑erp解决方案&#xff1a; 生产成本高昂…

LeetCode452用最少数量的箭引爆气球

题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处…

华为数据驱动的企业数字化转型之路

华为数据驱动的企业数字化转型之路 数据驱动的数字化转型是企业未来发展的关键。通过构建完善的数据治理体系&#xff0c;包括差异化的数据管理、面向业务的信息架构、数据底座建设和自助数据服务&#xff0c;企业可以提升数据的利用效率和决策能力。本文将根据华为数据治理相…

Idea多线程调试

在 IntelliJ IDEA 中调试多线程应用程序可能会有些复杂&#xff0c;因为多个线程可能会同时运行和交互。不过&#xff0c;IDEA 提供了一些强大的工具来帮助你进行多线程调试。以下是一些关键步骤和技巧&#xff0c;帮助你有效地调试多线程应用程序&#xff1a; 创建一个示例多线…

《精通ChatGPT:从入门到大师的Prompt指南》附录C:专业术语表

附录C&#xff1a;专业术语表 本附录旨在为读者提供一本全面的术语表&#xff0c;帮助理解《精通ChatGPT&#xff1a;从入门到大师的Prompt指南》中涉及的各种专业术语。无论是初学者还是高级用户&#xff0c;这些术语的定义和解释将为您在使用ChatGPT时提供重要参考。 A AI&…

Linux中Web服务器配置和管理(Apache)

文章目录 一、WEB服务器介绍1.1、WEB服务器概述1.2、WEB服务器的发展历史1.3、WEB服务器的优点与缺点1.4、WEB服务器的工作流程 二、Apache介绍2.1、Apache是什么2.2、Apache的发展史与应用场景2.3、Apache的特点2.4、Apache的工作原理2.5、Apache的模块 三、安装使用Apache服务…

调用百度API实现图像多主体检测

目录 1. 作者介绍2&#xff0e;百度API介绍与获取2.1 API介绍2.2 注册账号并获取API Key 3&#xff0e;完整实验代码&#xff0c;测试结果3.1 调用API3.2框出主体部分&#xff0c;并标注标签和置信度3.3 测试结果 1. 作者介绍 邓富贵&#xff0c;男&#xff0c;西安工程大学电…

【动态规划】| 详解路径问题之地下城游戏 力扣174 (困难题)

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;动态规划 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/minimum-path-sum/description/ 建议先看一下前面…