【uniapp微信小程序+springBoot(binarywang)
uniapp前端代码
<template><view><page-head :title="title"></page-head><view class="uni-padding-wrap"><view style="background:#FFF; padding:50rpx 0;"><view class="uni-hello-text uni-center font-lg text-danger">{{vipName}}</view><view class="uni-h1 uni-center uni-common-mt"><text class="rmbLogo">¥</text><input class="price" type="digit" :value="price" maxlength="5" @input="priceChange" /></view></view><view class="uni-btn-v uni-common-mt"><!-- #ifdef MP-WEIXIN || MP-QQ --><button type="primary" @click="weixinPay" :loading="loading">微信支付</button><!-- #endif --></view></view></view></view>
</template>
<script>export default {data() {return {title: 'request-payment',loading: false,typeId:0,vipName:'',price: 1,providerList: [],user:'',baseLocation: '',memberCardOrders:[],header: { 'Content-Type': 'application/x-www-form-urlencoded' }}},onLoad: function(e) {this.baseLocation = getApp().globalData.BaseUrl;this.user = uni.getStorageSync('user');if(e.id){this.typeId=e.id;}if(e.typeName){this.vipName=e.typeName;}if(e.currentPrice){this.price=e.currentPrice;}},methods: {//登录async login() {// #ifdef APP-PLUS || H5this.$loginForAppAndH5();// #endif// #ifdef MP-WEIXINthis.$loginForWeiXinApplet();// #endif},//微信支付weixinPay() {this.loading = true;uni.login({success: (e) => {let ticket = uni.getStorageSync('ticket'); //取出Cookieif (ticket) {this.header.Cookie = ticket;uni.request({url:this.baseLocation + '/api/client/pay/appletPaymentPay',header:this.header,data:{memberCardTypeId: this.typeId,payType: 'APPLETPAYMENT',orderAmount: this.price,memberCardTypeName: this.vipName,code:e.code},success: (res) => {if (res.data.code === 200) {let paymentData = res.data.payment;uni.requestPayment({timeStamp: paymentData.timeStamp,nonceStr: paymentData.nonceStr,package: paymentData.packageValue,signType: paymentData.signType,paySign: paymentData.paySign,success: (res) => {uni.showToast({title:'支付成功,即将跳转到会员中心...',icon:'none',duration:1000})uni.reLaunch({url:'membercenter'})},fail: (res) => {uni.showModal({content: "支付失败,原因为: " + res.errMsg,showCancel: false})return false;},complete: () => {this.loading = false;}})} else {uni.showModal({content: res.data.message,showCancel: false})return false;}},fail: (e) => {this.loading = false;uni.showModal({content: "支付失败,原因为: " + e.errMsg,showCancel: false})return false;}})}else{this.login(); }},fail: (e) => {this.loading = false;uni.showModal({content: "支付失败,原因为: " + e.errMsg,showCancel: false})return false;}})},//价格计算priceChange(e) {this.price = e.detail.value;}}}
</script><style>.rmbLogo {font-size: 40rpx;}button {background-color: #007aff;color: #ffffff;}.uni-h1.uni-center {display: flex;flex-direction: row;justify-content: center;align-items: flex-end;}.price {border-bottom: 1px solid #eee;width: 200rpx;height: 80rpx;padding-bottom: 4rpx;}.ipaPayBtn {margin-top: 30rpx;}
</style>
后端代码
<!--公众号(包括订阅号和服务号) -->
<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>2.7.0</version>
</dependency>
<!--微信支付 -->
<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-pay</artifactId><version>3.0.0</version>
</dependency>
<!--微信小程序 -->
<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-miniapp</artifactId><version>3.0.0</version>
</dependency>
#微信小程序
wx.applet.appId=xxxxxxxxxxxxxxxx
wx.applet.appSecret=xxxxxxxxxxxxxxxx
package com.ltf.config;import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@Component
@ConfigurationProperties(prefix = "wx.applet")
public class WeChatAppletProperties {/*** appId*/private String appId;/*** 公众平台***/private String appSecret;@Overridepublic String toString() {return ToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE);}}
package com.ltf.controller;import com.ltf.common.ReqChanle;
import com.ltf.config.WeChatAppletProperties;
import com.ltf.config.WeChatPayProperties;
import com.ltf.dao.MemberCardOrdersDao;
import com.ltf.entity.MemberCardOrders;
import com.ltf.service.MemberCardOrdersService;
import com.ltf.service.MemberCardTrxorderDetailService;
import com.ltf.utils.HttpRequestUtil;
import com.ltf.utils.SingletonLoginUtils;
import com.ltf.utils.WebUtils;
import com.alibaba.fastjson.JSONObject;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;/*** 微信支付* @author xhz**/
@RestController
@RequestMapping(value = "/api/client/pay/")
public class WeChatPayController extends BaseController{private static final Logger logger = LoggerFactory.getLogger(WeChatPayController.class);@Autowiredprivate WxPayService wxPayService;@Autowiredprivate MemberCardOrdersService memberCardOrdersService;@Autowiredprivate MemberCardOrdersDao memberCardOrdersDao;@Autowiredprivate MemberCardTrxorderDetailService memberCardTrxorderDetailService;@Autowiredprivate WeChatAppletProperties weChatAppletProperties;/*** 1块钱转为 100 分* 元转分** @param bigDecimal 钱数目* @return 分*/private int yuanToFee(BigDecimal bigDecimal) {return bigDecimal.multiply(new BigDecimal(100)).intValue();}/*** 100分转为1块钱* 分转元* * @param price 钱数目* @return 元*/private String feeToYuan(Integer price) {return BigDecimal.valueOf(Long.valueOf(price)).divide(new BigDecimal(100)).toString();}/*** 小程序支付* @param request* @param memberCardTypeId* @param payType* @param orderAmount* @param memberCardTypeName* @param code* @return*/@SuppressWarnings("static-access")@GetMapping(value = "appletPaymentPay")@ResponseBodypublic JSONObject appletPaymentPay(HttpServletRequest request,@RequestParam("memberCardTypeId")String memberCardTypeId,@RequestParam("payType")String payType,@RequestParam("orderAmount")String orderAmount,@RequestParam("memberCardTypeName")String memberCardTypeName,@RequestParam("code")String code){try {Integer userId=SingletonLoginUtils.getLoginUserId(request);if(userId>0){Map<String, String> sourceMap = new HashMap<String, String>();sourceMap.put("memberCardTypeId", memberCardTypeId);// 会员卡类型idsourceMap.put("userId", userId+ "");//用户idsourceMap.put("reqchanle", ReqChanle.APLLET.toString());//用户请求来源sourceMap.put("payType", payType);// 支付类型sourceMap.put("reqIp", WebUtils.getIpAddr(request));// 用户ipsourceMap.put("orderAmount", orderAmount);// 订单原始金额,也是实际支付金额sourceMap.put("memberCardTypeName", memberCardTypeName);//会员卡类型名称Map<String, Object> res = memberCardOrdersService.addTrxorder(request,sourceMap);if(res.containsKey("msg")){return this.formatJSON(501, "会员卡订单创建失败!", res);}else{String param="appid="+weChatAppletProperties.getAppId()+"&secret="+weChatAppletProperties.getAppSecret()+"&js_code="+code+"&grant_type=authorization_code";String result=HttpRequestUtil.doJsonGet("https://api.weixin.qq.com/sns/jscode2session", param);if(result!=null&&!"".equals(result)){JSONObject jsonObject1=JSONObject.parseObject(result);if(jsonObject1.get("openid")!=null){WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();orderRequest.setAppid(weChatAppletProperties.getAppId());orderRequest.setBody(memberCardTypeName);orderRequest.setOutTradeNo(res.get("orderNo").toString());orderRequest.setTradeType("JSAPI");orderRequest.setTotalFee(yuanToFee(new BigDecimal(orderAmount)));String openId=jsonObject1.get("openid").toString();orderRequest.setOpenid(openId);// 获取微信支付用户的openIdorderRequest.setSpbillCreateIp(InetAddress.getLoopbackAddress().getHostAddress());orderRequest.setNotifyUrl("https://你的域名/api/client/pay/appletPaymentPayNotify");Object order = wxPayService.createOrder(orderRequest);res.put("payment", order);return this.formatJSON(200, "OK", res);}else{return this.formatJSON(500, "openId获取失败!",null);}}else{return this.formatJSON(500, "openId获取失败!",null);}}}else{return this.formatJSON(500, "当前登录已失效,请重新登录!",null);}} catch (Exception e) {logger.error("WeChatPayController.appletPaymentPay()----error", e);return this.formatJSON(500, "微信小程序支付时会员卡订单创建失败!",null);}}/**** @param xmlData 小程序支付返回的流* @return*/@RequestMapping(value = "appletPaymentPayNotify",method = {RequestMethod.GET,RequestMethod.POST})public String appletPaymentPayNotify(@RequestBody String xmlData){try {final WxPayOrderNotifyResult notifyResult = this.wxPayService.parseOrderNotifyResult(xmlData);//这里是存储我们发起支付时订单号的信息,所以取出来MemberCardOrders memberCardOrders=new MemberCardOrders();memberCardOrders.setOrderNo(notifyResult.getOutTradeNo());//根据订单号查询订单MemberCardOrders mco=memberCardOrdersDao.selectMemberCardOrdersByCondition(memberCardOrders);//验证商户id和价格,以防止篡改金额if(mco!=null){if(weChatPayProperties.getMchId().equals(notifyResult.getMchId())&¬ifyResult.getTotalFee().equals(yuanToFee(mco.getSumMoney()))){Map<String,Object> map=new HashMap<String,Object>();map.put("sumMoney", feeToYuan(notifyResult.getTotalFee()));//订单总金额map.put("outTradeNo", notifyResult.getTransactionId());//支付宝的交易号map.put("orderNo", notifyResult.getOutTradeNo());//商户系统的唯一订单号map.put("states", notifyResult.getResultCode());//交易状态map.put("payTime", notifyResult.getTimeEnd());//支付时间//修改会员卡订单信息String result1=memberCardOrdersService.updateMemberCardOrderInfoForNotify(map);if(result1.equals("error")){return WxPayNotifyResponse.fail("修改会员卡订单信息失败!");}//修改会员卡订单流水信息String result2=memberCardTrxorderDetailService.updateMemberCardTrxorderDetaiInfoForNotify(map);if(result2.equals("error")){return WxPayNotifyResponse.fail("修改会员卡订单流水信息失败!");}//成功后回调微信信息return WxPayNotifyResponse.success("回调成功!");}else{return WxPayNotifyResponse.fail("商户id和价格验证不通过!");}}else{return WxPayNotifyResponse.fail("订单号不存在!");}} catch (WxPayException e) {logger.error("WeChatPayController.appletPaymentPayNotify()----error", e);return WxPayNotifyResponse.fail("微信小程序支付回调有误!");}}}
相关文章:
【uniapp微信小程序+springBoot(binarywang)
uniapp前端代码 <template><view><page-head :title"title"></page-head><view class"uni-padding-wrap"><view style"background:#FFF; padding:50rpx 0;"><view class"uni-hello-text uni-cente…...

智能井盖的用处有哪些?好用在什么地方?
智能井盖是一种基于物联网技术的井盖系统,通过集成传感器、通信设备和数据处理功能,实现对井盖的实时监测、远程管理和智能化控制。WITBEE万宾的智能井盖传感器EN100-C2,只要在城市需要的井盖上面安装即可使用,一体式结构…...
微信小程序数据存储方式有哪些
在微信小程序中,数据存储方式有以下几种: 本地存储 本地存储是一种轻量级的数据存储方式,用于存储小量的数据,例如用户的配置信息、页面的状态等。微信小程序提供了 wx.setStorage() 和 wx.getStorage() 方法,用于将数…...
FTC局部路径规划代码分析
前置知识: costmap_2d::Costmap2DROS costmap; costmap_2d::Costmap2DROS 是一个ROS包中提供的用于处理2D成本地图的类。它是一个高级的接口,通常用于与ROS导航栈中的导航规划器和本地路径跟踪器等模块进行集成。 costmap 是一个指向 Costmap2DROS 对象的指针。通…...

SpringBoot集成Activiti7
SpringBoot集成Activiti7 SpringBoot版本使用2.7.16 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.16</version><relativePath/> <!-- lookup…...

25.1 MySQL SELECT语句
1. SQL概述 1.1 SQL背景知识 1946年, 世界上诞生了第一台电脑, 而今借由这台电脑的发展, 互联网已经成为一个独立的世界. 在过去几十年里, 许多技术和产业在互联网的舞台上兴衰交替. 然而, 有一门技术却从未消失, 甚至日益强大, 那就是SQL.SQL(Structured Query Language&…...

【VSCode】Windows环境下,VSCode 搭建 cmake 编译环境(通过配置文件配置)
除了之前的使用 VSCode 插件来编译工程外,我们也可以使用配置文件来编译cmake工程,主要依赖 launch.json 和 tasks.json 文件。 目录 一、下载编译器 1、下载 Windows GCC 2、选择编译器路径 二、配置 debug 环境 1、配置 lauch.json 文件 2、配置…...

useragent识别访问设备
背景需求 ruoyi框架,前后端分离。现在要在用户访问的时候根据不同的设备跳转到不同的登录页面。 教程 router/index.js 修改src/router/index.js,在这里增加自己的要跳转的页面 permission.js 在白名单中添加自己的登录页面 增加以下识别的代码 le…...

紫光同创FPGA实现UDP协议栈网络视频传输,带录像和抓拍功能,基于YT8511和RTL8211,提供2套PDS工程源码和技术支持
目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案紫光同创FPGA精简版UDP方案紫光同创FPGA带ping功能UDP方案紫光同创FPGA精简版UDP视频传输方案 3、设计思路框架OV5640摄像头配置及采集数据缓冲FIFOUDP协议栈详解MAC层发送MAC发送模式MAC层接收ARP发送ARP接收ARP缓…...

【机器学习】逻辑回归
文章目录 逻辑回归定义损失函数正则化 sklearn里面的逻辑回归多项式逻辑回归 逻辑回归 逻辑回归,是一种名为“回归”的线性分类器,其本质是由线性回归变化而来的,一种广泛使用于分类问题中的广义回归算法。 线性回归是机器学习中最简单的的…...

DITA-OT 4.0新特性 - PDF themes,定制PDF样式的新方法
随着DITA-OT 4.0的发布,它提供了一种新的定制PDF样式方法,这种方法就是PDF theme。这篇文章来聊一聊这种定制PDF输出的新方法和实验结果。 在进入PDF theme细节之前,为各位读者梳理一下DITA-OT将DITA和Markdown发布成PDF的几种方法。 - 1 …...
MySQL 8.0 OCP认证精讲视频、环境和题库之四 多实例启动 缓存、事务、脏读
一、配置第一个mysqld服务 1、编辑选项文件,指定以下选项: [mysqld] basedir/mysql80 datadir/mysql80/data1 socket/mysql80/data1/mysqld.sock pid-file/mysql80/data1/mysqld.pid log-error/mysql80/dat…...

对代码感兴趣 但不擅长数学怎么办——《机器学习图解》来救你
目前,该领域中将理论与实践相结合、通俗易懂的著作较少。机器学习是人工智能的一部分,很多初学者往往把机器学习和深度学习作为人工智能入门的突破口,非科班出身的人士更是如此。当前,国内纵向复合型人才和横向复合型人才奇缺;具有…...

【EI会议征稿】第三届大数据、信息与计算机网络国际学术会议(BDICN 2024)
第三届大数据、信息与计算机网络国际学术会议(BDICN 2024) 2024 3rd International Conference on Big Data, Information and Computer Network 第三届大数据、信息与计算机网络国际学术会议(BDICN 2024)定于2024年1月12-14日在…...

【Arduino+ESP32+腾讯云+sg90】强制门户+腾讯云控制开关灯
作者有话说 博主对于Arduino开发并没有基础,但是为了实现更加方便的配网,这几天一直在尝试用ESP32-12F(因为手头刚好有一个,其他的也可以)来做远程开关灯!不知道大家是否注意到,上一篇利用STM32…...

windows中elasticsearch7中添加用户名密码验证
1.找到elsatic的bin目录输入cmd 2.生成ca证书 输入 elasticsearch-certutil ca 在es7根目录生成ca证书,输入密码时直接回车即可,否则后面会报错 Please enter the desired output file [elastic-stack-ca.p12]: #这里直接回车即可 Enter password for…...

linux安装达梦数据库(命令行安装)
安装达梦数据库 创建安装用户 1,创建安装用户组dinstall [rootdmDMServer1 ~]# groupadd -g 12345 dinstallgroupadd : 创建组 -g : 指定组id(GID) 12345: 指定的组名称 dinstall : 组名 2,创建安装用户dmdba [rootdmDMSe…...

Flutter——最详细(CustomScrollView)使用教程
CustomScrollView简介 创建一个 [ScrollView],该视图使用薄片创建自定义滚动效果。 [SliverList],这是一个显示线性子项列表的银子列表。 [SliverFixedExtentList],这是一种更高效的薄片,它显示沿滚动轴具有相同范围的子级的线性列…...

解决容器内deepspeed微调大模型报错
解决容器内deepspeed微调大模型报错:[launch.py:315:sigkill_handler] Killing subprocess 问题描述:解决办法 问题描述: 在容器中用deepspeed微调百川大模型2时,出现上述错误,错误是由于生成容器时,共享内…...

UE 插件模块引用
如Plugons中的模块A想要引用模块B: 1、模块A中的.uplugin文件加入↓ 2、模块A中的.Build.cs文件加入↓ 3、在模块A需要用到模块B的地方直接include 4、重新generate Project 5、重新编译 注意两个模块之间不能循环引用...

生成模型+两种机器学习范式
生成模型:从数据分布到样本创造 生成模型(Generative Model) 是机器学习中一类能够学习数据整体概率分布,并生成新样本的模型。其核心目标是建模输入数据 x 和标签 y 的联合概率分布 P(x,y),即回答 “数据是如何产生的…...

CRM管理系统中的客户分类与标签管理技巧:提升转化率的核心策略
在客户关系管理(CRM)领域,有效的客户分类与标签管理是提升销售效率、优化营销ROI的关键。据统计,使用CRM管理系统进行科学客户分层的企业,客户转化率平均提升35%(企销客数据)。本文将深入解析在CRM管理软件中实施客户分类与标签管理的最佳实践…...
提高Python编程效率的工具推荐
在 Python 开发中,选择合适的工具可以显著提升编程效率。以下是一些经过精心挑选的工具,涵盖代码编辑、调试、数据分析等多个方面,希望能帮助你在 Python 开发中事半功倍。 一、集成开发环境(IDE) 1. PyCharm PyCha…...

Cursor + Claude 4:微信小程序流量主变现开发实战案例
前言 随着微信小程序生态的日益成熟,越来越多的开发者开始关注如何通过小程序实现流量变现。本文将详细介绍如何使用Cursor编辑器结合Claude 4 AI助手,快速开发一个具备流量主变现功能的微信小程序,并分享实际的开发经验和变现策略。 项目…...

鸿蒙PC,有什么缺点?
点击上方关注 “终端研发部” 设为“星标”,和你一起掌握更多数据库知识 价格太高,二是部分管理员权限首先,三对于开发者不太友好举个例子:VSCode的兼容性对程序员至关重要。若能支持VSCode,这台电脑将成为大多数开发者…...

【工具教程】PDF电子发票提取明细导出Excel表格,OFD电子发票行程单提取保存表格,具体操作流程
在企业财务管理领域,电子发票提取明细导出表格是不可或缺的工具。 月末财务结算时,财务人员需处理成百上千张电子发票,将发票明细导出为表格后,通过表格强大的数据处理功能,可自动分类汇总不同项目的支出金额ÿ…...
vue组件的data为什么是函数?
vue组件的data为什么是函数? 在JS中,实例是通过构造函数创建的,每个构造函数可以new出多个实例,每个实例都会继承原型上的方法和属性。 在vue中,一个vue组件就是一个实例,当一个组件被复用多次࿰…...

创建一个纯直线组成的字体库
纯直线组成的字体,一个“却”由五组坐标点组成,存储5个点共占21字节,使用简单,只要画直线即可, “微软雅黑”,2个轮廓,55坐标点,使用复杂,还填充。 自创直线字体 “微软…...
Go 语言实现高性能 EventBus 事件总线系统(含网络通信、微服务、并发异步实战)
前言 在现代微服务与事件驱动架构(EDA)中,事件总线(EventBus) 是实现模块解耦与系统异步处理的关键机制。 本文将以 Go 语言为基础,从零构建一个高性能、可扩展的事件总线系统,深入讲解&#…...

FPGA 动态重构配置流程
触发FPGA 进行配置的方式有两种,一种是断电后上电,另一种是在FPGA运行过程中,将PROGRAM 管脚拉低。将PROGRAM 管脚拉低500ns 以上就可以触发FPGA 进行重构。 FPGA 的配置过程大致可以分为:配置的触发和建立阶段、加载配置文件和建…...