[golang gin框架] 33.Gin 商城项目- 微信支付操作相关功能讲解

news2024/11/29 20:49:57

一.微信支付准备工作

  1. 准备工作

申请条件: 个体工商户 企业、政府及事业单位
PC网站接入支付官网,其他(app,小程序,公众号等)可参考 PC网站接入支付
  1. 需要获取内容

  • appid:应用 APPID(必须配置,开户邮件中可查看)

  • MCHID:微信支付商户号(必须配置,开户邮件中可查看)

  • KEY:API 密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)

  1. 注册商户平台,申请微信支付

注册微信商户平台申请入口: PC网站接入支付
注意:
信息必须如实填写,尤其是截图的内容,以及销售商品的分类选择要和自己公司的匹配,不然容易审核失败。审核失败后,看看失败原因、修改重新提交申请
  1. 开户成功,登录商户平台进行验证

资料审核通过后,商户信息会发到对应的账户邮箱里面,请登录联系人邮箱查收商户号和
密码,并登录商户平台填写财付通备付金打的小额资金数额,完成账户验证( 查看验证方法)
  1. 登录商户平台点击产品中心开通 Native 支付

  1. 用微信给你发的商户号登陆对应的微信商户平台,获取API 密钥

步骤如下:

  • 微信商户平台(pay.weixin.qq.com)-->账户设置-->API 安全-->密钥设置

  • API 密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)

API 密钥设置地址: https://pay.weixin.qq.com/index.php/account/api_cert,设置的时候可能会提示安装证书

二.支付案例

  1. 微信 pc 端网站支付流程

官网文档: Native支付
参考文章: 微信支付,JSAPI支付,APP支付,H5支付,Native支付,小程序支付功能详情以及回调处理
  • (1).调用统一下单接口生成预支付交易,获取 code_url

  • (2).用 code_url 生成二维码

  • (3)支付成功后监听服务器的异步通知,然后处理订单

  • 支付成功以后微信官方会给商品配置的异步通知地址 post 数据,然后验证 post 数据是否
    正确,如果正确的话执行修改订单操作

  • 注意:1).域名必须备案 2).产品中心->Native 支付->产品设置->扫码支付 扫码回调链接 必须配置

  1. Golang 微信支付 sdk

官方sdk文档地址, 官方github sdk, 其他github sdk
  1. 支付代码案例

package frontend

import (
    "fmt"
    "time"
    "github.com/astaxie/beego"
    "github.com/gin-gonic/gin"
    "github.com/objcoding/wxpay"
)

type WxpayController struct{}

//微信支付请求
func (con WxpayController) Wxpay(c *gin.Context) {
    //1、配置基本信息
    account := wxpay.NewAccount(
        "wxxxx",
        "150xxx",
        "zhxxx666",
        false,
    )
    client := wxpay.NewClient(account)

    //2、获取ip地址   订单号等信息
    ip := c.ClientIP()
    template := "200601021504"
    //订单号
    tradeNo := time.Now().Format(template)
    //3、调用统一下单
    params := make(wxpay.Params)
    params.SetString("body", "Gin微信支付11").
        SetString("out_trade_no", tradeNo).
        SetInt64("total_fee", 1). //1分
        SetString("spbill_create_ip", ip).
        SetString("notify_url", "http://xxx/wxpay/notify"). //异步通知url:必须在商户平台的Native支付回调链接里面配置
        // SetString("trade_type", "APP")
        SetString("trade_type", "NATIVE") //网站支付需要改为NATIVE,根据不同支付类型修改

    p, err1 := client.UnifiedOrder(params)
    if err1 != nil {
        beego.Error(err1)
    }
    //4、获取code_url 生成支付二维码
    c.JSON(200, gin.H{
        "result": p,
    })
}

/*
微信支付异步回调通知:
1、发布到服务器测试
2、必须在商户平台的Native支付回调链接里面配置
3、如何接收XML的数据  c.GetRawData()
4、如何获取数据
5、如何验证数据
6、更新数据
*/
func (con WxpayController) WxpayNotify(c *gin.Context) {
    //1、获取表单传过来的xml数据
    xmlByte, _ := c.GetRawData()
    xmlStr := string(xmlByte)

    postParams := wxpay.XmlToMap(xmlStr)

    //2、校验签名
    account := wxpay.NewAccount(
        "wx7xxx6e4",
        "15xxx1",
        "zhxxx66",
        false,
    )
    client := wxpay.NewClient(account)
    //校验返回的数据是否合法
    isValidate := client.ValidSign(postParams)

    fmt.Println(isValidate)
    fmt.Println("-----更新订单-----")
    fmt.Println(postParams)
    //3、更新订单
    c.String(200, "ok")
}
  1. Gin 解析 XML 的数据

在 API 的开发中,经常会用到 JSON 或 XML 来作为数据交互的格式,这个时候
可以在 gin 中使用 c.GetRawData()获取数据
<?xml version="1.0" encoding="UTF-8"?>
<article>
    <content type="string">我是张三</content>
    <title type="string">张三</title>
</article>
type Article struct {
    Title string `xml:"title"`
    Content string `xml:"content"` 
}

router.POST("/xml", func(c *gin.Context) {
    b, _ := c.GetRawData() // 从 c.Request.Body 读取请求数据
    article := &Article{}
    if err := xml.Unmarshal(b, &article); err == nil {
        c.JSON(http.StatusOK, article)
    } else {
        c.JSON(http.StatusBadRequest, err.Error())
    }
})

ok,微信PC支付操作完成

[上一节][golang gin框架] 32.Gin 商城项目- 支付宝支付操作相关功能讲解

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

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

相关文章

Java Socket和ServerSocket 使用

在Java中&#xff0c;Socket和ServerSocket是用于创建网络连接的重要类。Socket类用于创建客户端套接字&#xff0c;而ServerSocket类用于创建服务器套接字。在本文中&#xff0c;我们将讨论Socket和ServerSocket的作用、使用方法以及相关代码示例。 Socket的作用 Socket是Jav…

【连续介质力学】张量的并矢和性质1

张量的代数操作 并矢 Dyadic 两个向量的张量积是一个并矢&#xff0c;得到一个二阶张量 u ⃗ v ⃗ u ⃗ ⨂ v ⃗ A \vec u \vec v \vec u \bigotimes \vec v A u v u ⨂v A 其中&#xff0c; ⨂ \bigotimes ⨂是张量乘积&#xff0c;任意张量可以表示成并矢的线性组合 …

戴尔 Dell XPS 13 7390电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板戴尔 Dell XPS 13 7390 处理器Intel Core i7-10510u已驱动 内存 16 GB ( 酷兽 DDR4 3200MHz 8GB x 2 )已驱动 硬盘三星 SSD 860 EVO 250GB (250 …

【iOS】--KVC与KVO

键值编码&#xff08;KVC&#xff09;与键值监听&#xff08;KVO&#xff09; KVC&#xff08;Key Value Coding&#xff09;允许以字符串的形式间接操作对象的属性。 简单的KVC 最基本的KVC由NSKeyValueCoding协议提供支持&#xff0c;最基本的操作属性的两个方法如下 set…

利用具有局部信息的引导自注意进行息肉分割

文章目录 Using Guided Self-Attention with Local Information for Polyp Segmentation摘要本文方法PP-Guided Self-AttentionLocal-to-Global Mechanism损失函数 实验结果 Using Guided Self-Attention with Local Information for Polyp Segmentation 摘要 背景 自动准确的…

Microsoft Edge是一款现代化的浏览器,它拥有众多功能和强大的性能

随着互联网的不断发展&#xff0c;浏览器已经成为我们日常生活中必不可少的工具之一。作为一款现代化的浏览器&#xff0c;Microsoft Edge拥有许多强大的功能&#xff0c;为用户带来更加流畅的浏览体验。最近&#xff0c;Edge推出了分屏功能&#xff0c;这项功能可以大大提高生…

STM32------ADC

ADC 1、ADC介绍 1、1介绍 ADC即模数转换器。 例如&#xff1a;电信号转化成数字量。 1、2 ADC类型 并联比较型、逐次逼近型 并联比较型如下&#xff1a; 分压部分比较部分编码部分。 ADC分辨率&#xff1a;三位&#xff08;上图&#xff09; 优点&#xff1a;转换速度快…

类和对象下

文章目录 一、初始化列表1、语法&#xff1a;2、初始化顺序 二、static成员三、友元1、友元函数2、友元类 四、拷贝对象时的编译器优化例1、例2、例3、 一、初始化列表 1、语法&#xff1a; 初始化列表&#xff1a; 以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员…

【Python PyTorch】零基础也能轻松掌握的学习路线与参考资料

文章目录 一、PyTorch的基础知识二、PyTorch数据处理三、PyTorch模型构建四、PyTorch模型训练和评估五、总结 作为当前最流行的深度学习框架之一&#xff0c;PyTorch已成为许多数据科学家和深度学习工程师的首选。本文将提供一条针对初学者的完整的学习路线&#xff0c;包括PyT…

hnust 湖南科技大学 2023 安卓 期中考试 复习资料

前言 ★&#xff1a;录音中提到的致谢&#xff1a;hwl&#xff0c;lqx&#xff0c;ly&#xff0c;sw重点来源&#xff1a;7-8班 PPT和录音内容来源&#xff1a;PPT知识点大多很抽象&#xff0c;需要联系实际代码来理解多做1-9章课后习题&#xff0c;编程题可以不做获取最新版本…

【AI大模型】“讯飞星火”大模型计划10月底赶超ChatGPT

文章目录 前言你使用过这种对话式AI吗&#xff1f;有什么看法或感受&#xff1f;“讯飞星火大模型将超越chatgpt&#xff1f;”这类型的人工智能对现在的社会有什么意义&#xff1f;这类型的人工智能&#xff0c;未来前景如何&#xff1f;申请体验写在最后 前言 5月6日&#xf…

第十三章 使用Postfix与Dovecot部署邮件系统

文章目录 第十三章 使用Postfix与Dovecot部署邮件系统一、电子邮件系统1、常见的邮件协议2、注意事项 二、部署电子邮件系统1、部署基础的电子邮件系统&#xff08;1&#xff09;、配置服务器主机名称&#xff08;2&#xff09;、配置服务器的DNS地址&#xff08;3&#xff09;…

【LeetCode: 115. 不同的子序列 | 暴力递归=>记忆化搜索=>动态规划 | 位置对应】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

队列Queue和栈Stack

什么是队列queue? 先进先出表,是一种受限制的线性表.其限制是仅允许在表的队尾进行插入数据和表的队头进行删除数据. 队列的使用场景: 线程池ThreadPoolExecutor ThreadPoolExecutor源码中核心变量(前面3个是重点) corePoolSize线程池维护的最小线程数量,哪怕是空闲的BlockQ…

Carla仿真三:Traffic Manager交通管理器详解

CARLA Traffic Manager 一、什么是Traffic Manager1、Traffic Manager简介2、Traffic Manager框架3、Traffic Manager模块 二、Traffic Manager控制方法1、TM控制交通参与者的自动驾驶的规则2、TM控制交通参与者行为的API摘要3、TM控制交通参与者行为的API 三、Traffic Manager…

力扣sql中等篇练习(十九)

力扣sql中等篇练习(十九) 1 苹果和桔子的个数 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # 没有使用group by也可以使用sum函数,因为默认是所有数据行自成一组 SELECT SUM(b.apple_countIFNULL(c.…

[LeetCode周赛复盘] 第 104 场双周赛20230513

[LeetCode周赛复盘] 第 104 场双周赛20230513 一、本周周赛总结6366. 老人的数目1. 题目描述2. 思路分析3. 代码实现 6367. 矩阵中的和1. 题目描述2. 思路分析3. 代码实现 6369. 最大或值1. 题目描述2. 思路分析3. 代码实现 6423. 英雄的力量1. 题目描述2. 思路分析3. 代码实现…

C:sh: 总是爆出:1: pause: not found

在linux平台下应该使用&#xff1a;pause() 导入&#xff1a;#include unistd.h 也就是unix下的标准函数&#xff0c;而不是代码不跨平台&#xff0c;从其他语言转来的新手很不舒服 参考&#xff1a;sh: 1: pause: not found_yjyn1的博客-CSDN博客

mysql数据库的表约束

表的约束 5.1&#xff1a;表的约束的概念 定义&#xff1a; 数据库表约束是用于定义和实施数据完整性的规则或条件。它们被应用于数据库表中的列&#xff0c;以确保数据的一致性、有效性和准确性。表约束可以强制执行特定的规则&#xff0c;限制数据的插入、更新或删除操作&…

ChatGPT的诞生和发展

ChatGPT的诞生和发展 ChatGPT是一种基于GPT模型的聊天机器人。GPT模型是一种基于深度学习的自然语言处理模型&#xff0c;由OpenAI团队开发&#xff0c;可以生成与输入文本相关的连续文本。ChatGPT的诞生和发展&#xff0c;可以追溯到GPT模型的开发与应用。 一、GPT模型的开…