微信支付篇---用户支付订单

微信支付篇—用户支付订单

在这里插入图片描述
创建PayOrderForm.java

@Data
@ApiModel(value = "订单付款的表单")
public class PayOrderForm {
    @ApiModelProperty(value = "订单ID")
    @Min(1)
    private Integer orderId;

}

编写WxController中的创建付款方法,用于创建支付订单

@Login
@PostMapping("/microAppPayOrder")
@ApiOperation("小程序付款")
public R microAppPayOrder(@RequestBody PayOrderForm form, @RequestHeader HashMap header) {
    ValidatorUtils.validateEntity(form);
    String token = header.get("token").toString();
    Long userId = Long.parseLong(jwtUtils.getClaimByToken(token).getSubject());
    int orderId = form.getOrderId();
    UserEntity user = new UserEntity();
    user.setUserId(userId);
    QueryWrapper wrapper = new QueryWrapper(user);
    long count = userService.count(wrapper);
    if (count == 0) {
        return R.error("用户不存在");
    }
    String openId = userService.getOne(wrapper).getOpenId();

    OrderEntity order = new OrderEntity();
    order.setUserId(userId.intValue());
    order.setId(orderId);
    order.setStatus(1);
    wrapper = new QueryWrapper(order);
    count = orderService.count(wrapper);
    if (count == 0) {
    return R.error("不是有效的订单");
    }
    //验证购物券是否有效
    //验证团购活动是否有效

    order = new OrderEntity();
    order.setId(orderId);
    wrapper = new QueryWrapper(order);
    order = orderService.getOne(wrapper);
    //向微信平台发出请求,创建支付订单
    String amount = order.getAmount().multiply(new BigDecimal("100")).intValue() + "";

    try {
        WXPay wxPay = new WXPay(myWXPayConfig);
        HashMap map = new HashMap();
        map.put("nonce_str", WXPayUtil.generateNonceStr()); //随机字符串
        map.put("body", "订单备注");
        map.put("out_trade_no", order.getCode());
        map.put("total_fee", amount);
        map.put("spbill_create_ip", "127.0.0.1");
        map.put("notify_url", "https://127.0.0.1/test");
        map.put("trade_type", "JSAPI");
        map.put("openid", openId);
        Map<String, String> result = wxPay.unifiedOrder(map);
        String prepayId = result.get("prepay_id");
        System.out.println(prepayId);
        if (prepayId != null) {
            order.setPrepayId(prepayId);
            order.setPaymentType(1);
            UpdateWrapper updateWrapper = new UpdateWrapper();
            updateWrapper.eq("id", order.getId());
            orderService.update(order, updateWrapper);

            //生成数字签名
            map.clear();
            map.put("appId", appId);
            String timeStamp = new Date().getTime() + "";
            map.put("timeStamp", timeStamp);
            String nonceStr = WXPayUtil.generateNonceStr();
            map.put("nonceStr", nonceStr);
            map.put("package", "prepay_id=" + prepayId);
            map.put("signType", "MD5");
            String paySign = WXPayUtil.generateSignature(map, key);
            return R.ok().put("package", "prepay_id=" + prepayId)
                .put("timeStamp", timeStamp)
                .put("nonceStr", nonceStr)
                .put("paySign", paySign);
        }
        else {
            return R.error("支付订单创建失败");
        }
    }
    catch (Exception e) {
        e.printStackTrace();
        return R.error("微信支付模块故障");
    }
}
编写order.vue
uni.request({
    url: that.url.wx.microAppPayOrder,
    method: "POST",
    header: {
        "token": uni.getStorageSync("token")
    },
    data: {
        "orderId": id
    },
    success: function(resp) {
        // console.log(resp)
        let timeStamp = resp.data.timeStamp
        let nonceStr = resp.data.nonceStr
        let pk = resp.data.package
        let paySign = resp.data.paySign
    }
})
微信支付接口说明

为了保证交易的安全,必须要使用HTTPS协议。

上传数据必须使用POST方式提交

提交的数据和返回的结果都是XML格式的,并且根节点叫做。这一点大家不用担心,因为上节课的最后,我说过微信平台提供了SDK程序包,在SDK程序包里面封装了生成XML文件、解析XML文件的方法。等到讲解程序的时候,我在详细说明

所有的数据必须采用UTF-8编码。

其实呢,只要我们使用微信支付的SDK程序,以上的问题都不用我们操心。

创建支付订单的接口说明

请求参数
在这里插入图片描述

  • appid参数是商户的公众号ID,也就是注册小程序账号时候得到的app-id

  • mch_id参数是商户号,申请微信支付的时候,可以在微信商户平台的网站上面得到商户号

  • nonce_str参数是随机字符串,这个可以用微信支付的SDK程序来生成

  • sign参数是签名字符串,签名字符串,就是我们对上传的数据做MD5计算,得到的结果就是签名字符串了。SDK程序可以帮我们完成这个功能。对上传的数据做签名,一方面预防数据丢包,另外一方面放置数据在网络传输过程中被篡改。所以微信平台收到数据之后,重新计算一下数字签名。跟提交上来的数字签名比较一下就知道了。

  • body参数是商品的概要描述,这个内容你可以随便写,是给支付订单做备注的,一般写的都是商品的名称。确认支付之前,小程序会拿着商户的支付参数,去微信平台搜索支付订单,然后用户手机上就会出现这个支付订单的信息了。其中就有订单的概要描述。这就是现在这个参数的用途

  • out_trade_no参数是商户订单号,你自己定义,或者用SDK程序生成,都是可以的

  • total_fee参数是订单金额,整数类型,单位不是元,而是分

  • spbill_create_ip参数是终端的IP地址,这里我们上传Cetus主机的IP地址即可,你写什么IP地址,都不会影响到微信支付的

  • notify_url参数是通知地址,这个参数非常重要。因为将来微信支付成功以后,微信平台会把支付成功的结果发送给cetus项目,这里写的就是cetus项目接收支付结果的URL路径。如果这个地址写错了,倒是不会影响到微信支付,只是在支付成功以后,微信平台会每隔几分钟发送一次通知请求。如果没有响应,发过若干次通知之后,微信平台就不会发送通知了。因为cetus项目还没有发布,没有固定网址,所以我们写程序的时候,这个回调地址可以先随便写一个,等将来我们把cetus项目部署在腾讯云上面,再把这个回调通知地址改成真实的网址即可。

  • trade_type参数是交易类型,固定写成JSAPI

  • openid参数也就是微信用户登陆小程序时候,传给cetus项目的参数

响应结果
在这里插入图片描述
以下字段在return_code为SUCCESS的时候有返回
在这里插入图片描述
以下字段在return_code 和result_code都为SUCCESS的时候有返回
在这里插入图片描述

<xml>
   <return_code><![CDATA[SUCCESS]]></return_code>
   <return_msg><![CDATA[OK]]></return_msg>
   <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
   <mch_id><![CDATA[10000100]]></mch_id>
   <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
   <openid><![CDATA[oUpF8uMuAJO_M2pxb1Q9zNjWeS6o]]></openid>
   <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
   <result_code><![CDATA[SUCCESS]]></result_code>
   <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
   <trade_type><![CDATA[JSAPI]]></trade_type>
</xml>

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[手游] 正义对决3

《正义对决3联机版》是一款多人联机的竞技射击游戏&#xff0c;玩家将扮演警方和强盗两个不同的势力&#xff0c;展开一场在庞大都市中的正义之战。强盗一方将在城市内抢劫各处并藏匿&#xff0c;而警方则必须将所有罪犯绳之以法。游戏中&#xff0c;玩家可自由购买众多武器装备…

k8s——Pod详解

一、Pod基础概念 1.1 Pod定义 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行…

C#_库的引用

类库的引用 还可以自己引用类库&#xff1a;解决方案-添加-新建项目 主程序 using System; using System.Windows.Forms; using Tools;namespace ConsoleApp2 {class Program{static void Main(string[] args){//Console.WriteLine("helloword");// Form form ne…

北斗短报文终端 | 什么是北斗短报文功能?如何实现北斗短报文通信?

北斗短报文功能是指通过北斗卫星进行短报文通信的功能。这种功能允许用户在没有移动通信信号覆盖的偏远山区、海洋、沙漠等地带&#xff0c;通过北斗短报文终端发送和接收文本信息&#xff0c;进行基本的数据通信。 北斗短报文功能是指北斗卫星导航系统特有的双向报文通信功能。…

力扣654. 最大二叉树

Problem: 654. 最大二叉树 文章目录 题目描述思路复杂度Code 题目描述 思路 对于构造二叉树这类问题一般都是利用先、中、后序遍历&#xff0c;再将原始问题分解得出结果 1.定义递归函数build&#xff0c;每次将一个数组中的最大值作为当前子树的根节点构造二叉树&#xff1b;…

win11 wsl ubuntu24.04

win11 wsl ubuntu24.04 一&#xff1a;开启Hyper-V二&#xff1a;安装wsl三&#xff1a;安装ubuntu24.04三&#xff1a;桥接模式&#xff0c;固定IP四&#xff1a;U盘使用五&#xff1a;wsl 从c盘迁移到其它盘参考资料 一&#xff1a;开启Hyper-V win11家庭版开启hyper-v 桌面…

Python异常处理:打造你的代码防弹衣!

Hi&#xff0c;我是阿佑&#xff0c;上文咱们讲到——揭秘Python的魔法&#xff1a;装饰器的超能力大揭秘 ‍♂️✨&#xff0c;阿佑将带领大家通过精准捕获异常、使用with语句和上下文管理器、以及异常链等高级技巧来增强代码的健壮性。就像为代码穿上防弹衣&#xff0c;保护它…

【JavaScript】文件下载

文件下载的消息格式 服务器只要在响应头中加入 Content-Disposition: attachment; filename"kxx" 即可触发浏览器的下载功能其中&#xff1a; attachment 表示附件&#xff0c;浏览器看到此字段&#xff0c;触发下载行为&#xff08;不同的浏览器下载行为有所区别&…

AI原生嵌入式矢量模型数据库ChromaDB-部署与使用指南

在人工智能大模型领域&#xff0c; 离不开NLP技术&#xff0c;在NLP中词向量是一种基本元素&#xff0c;如何存储这些元素呢&#xff1f; 可以使用向量数据库ChromeDB Chroma Chroma 是 AI 原生开源矢量数据库。Chroma 通过为 LLM 提供知识、事实和技能&#xff0c;使构建 L…

Leetcode刷题笔记4:链表基础2

导语 leetcode刷题笔记记录&#xff0c;本篇博客记录链表基础2部分的题目&#xff0c;主要题目包括&#xff1a; 24 两两交换链表中的节点19 删除链表的倒数第N个节点160 链表相交142 环形链表II 链表的定义 Python中&#xff0c;对于一个链表的节点定义非常简单&#xff0…

【算法】前缀和算法——和为k的子数组之和

题解&#xff1a;和为k的子数组之和(前缀和算法) 目录 1.题目2.题解思路2.1前缀和 哈希表&#xff0c;算法步骤&#xff1a;2.2细节如下&#xff1a;2.3参考代码&#xff1a; 3.总结及思考 1.题目 题目链接&#xff1a;LINK 2.题解思路 暴力求解自然不用多说&#xff0c;时…

STM32电机驱动模块(L9110S)

一、L9110S简介 L9110S是一种常用的双通道H桥电机驱动器集成电路&#xff0c;用于控制直流电机的方向和速度。它可以同时控制两个电机&#xff0c;每个通道最大可输出800mA的电流。L9110S具有高效的电源管理和过流保护功能&#xff0c;可以保护电路免受电机反冲电流的损害。它…

产品推荐 | 基于Xilinx XCKU115的半高PCIe x8 硬件加速卡

一、板卡概述 本板卡系我公司自主研发&#xff0c;采用Xilinx公司的XCKU115-3-FLVF1924-E芯片作为主处理器&#xff0c;主要用于FPGA硬件加速。板卡设计满足工业级要求。如下图所示&#xff1a; 二、功能和技术指标 板卡功能 参数内容 主处理器 XCKU115-3-FLVF1924-E 板卡…

基于Matlab实现BP神经网络的手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是计算机视觉和模式识别领域的一个经典问题&#xff0c;具有广泛的应用场景&…

深度学习模型keras第十七讲:使用 KerasCV 进行目标检测

1、绪论 1.1 KerasCV概念 KerasCV是一个模块化计算机视觉组件库&#xff0c;它可与TensorFlow、JAX或PyTorch原生配合使用。这些模型、层、指标、回调等基于Keras Core构建&#xff0c;可以在任何框架中进行训练和序列化&#xff0c;并在另一个框架中重复使用&#xff0c;而无…

基于Matlab完整版孤立词识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 孤立词识别是语音识别领域的一个重要分支&#xff0c;其目标是将输入的语音信号转换为计算机可…

C#【进阶】迭代器

迭代器 文章目录 1、迭代器概念2、标准迭代器的实现方法3、用yield return 语法糖实现迭代器4、用yield return 语法糖为泛型类实现迭代器 1、迭代器概念 迭代器&#xff08;iterator&#xff09; 又称光标&#xff08;cursor&#xff09; 是程序设计的软件设计模式 迭代器提供…

DVWA登录页面空白问题解决

问题&#xff1a; 创建完成后打开登录页面&#xff0c;发现打不开&#xff0c;一片空白 解决&#xff1a; php版本不对&#xff0c;更换版本即可

开发者必看:Linux终端的10大装逼神器,让你的命令行炫酷起来!

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

工具推荐:市面上有哪些带有ai问答机器人的SaaS软件

众所周知&#xff0c;SaaS&#xff08;软件即服务&#xff09;模式下的AI问答机器人已经逐渐成为企业、个人在办公、生活和学习中的辅助工具。ai问答机器人凭借高效、便捷、智能的特点&#xff0c;为用户提供了全新的交互体验。本文将推荐几款市面上好用的带有ai问答机器人的Sa…