【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、重新编译 注意两个模块之间不能循环引用...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...