【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())&&notifyResult.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("微信小程序支付回调有误!");}}}

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

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

相关文章

pycharm2020无法打开,点击无反应

pycharm 2020 无法打开&#xff0c;点击无反应&#xff0c;今天我碰到这现象&#xff0c;总结大体原因 C:\Users\ygw\AppData\Roaming\JetBrains &#xff08;删除该目录即可&#xff0c;一般由于升级安装 或 安装两个不同版本 会存在老旧文件影响导致&#xff09;

SpringSecurity + jwt + vue2 实现权限管理 , 前端Cookie.set() 设置jwt token无效问题(已解决)

问题描述 今天也是日常写程序的一天 , 还是那个熟悉的IDEA , 还是那个熟悉的Chrome浏览器 , 还是那个熟悉的网站 , 当我准备登录系统进行登录的时候 , 发现会直接重定向到登录页 , 后端也没有报错 , 前端也没有报错 , 于是我得脸上又多了一张痛苦面具 , 紧接着在前端疯狂debug…

dpdk/spdk/网络协议栈/存储/网关开发/网络安全/虚拟化/ 0vS/TRex/dpvs技术专家成长体系教程

课程围绕安全&#xff0c;网络&#xff0c;存储&#xff0c;云原生4个维度去讲解核心技术点。 6个专栏组成&#xff1a;dpdk网络专栏、存储技术专栏、安全与网关开发专栏、虚拟化与云原生专栏、测试工具专栏、性能测试专栏 一、dpdk网络 dpdk基础知识 多队列网卡&#xff0…

JavaScript学习笔记(一)

1、JavaScript是什么&#xff1f; 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言 2、JavaScript的组成是什么&#xff1f; ECMAScript&#xff08;基础语法&#xff09;、WebAPIS&#xff08;DOM、BOM&#xff09; 3、JavaScript书写位置有哪些&#xff1f;…

采集EtherNET/IP转Profinet在西门子plc中的应用

远创智控网关YC-EIPM-PN&#xff0c;让你的设备和云平台实时连接&#xff01; 远创智控YC-EIPM-PN网关产品支持各种数据接口&#xff0c;无论是工业领域的仪表、PLC、计量设备&#xff0c;还是设备数据&#xff0c;都能实时采集并整合。它将这些设备中的运行数据、状态数据等信…

学习pytorch13 神经网络-搭建小实战Sequential的使用

神经网络-搭建小实战&Sequential的使用 官网模型结构根据模型结构和数据的输入shape&#xff0c;计算用在模型中的超参数coderunning log网络结构可视化 B站小土堆pytorch视频学习 官网 https://pytorch.org/docs/stable/generated/torch.nn.Sequential.html#torch.nn.Se…

布朗大学发现GPT-4存在新问题,可通过非常见语言绕过限制

&#x1f989; AI新闻 &#x1f680; 布朗大学发现GPT-4存在新漏洞&#xff0c;可通过非常见语言绕过限制 摘要&#xff1a;布朗大学计算机科学研究人员发现了OpenAI的GPT-4存在新漏洞&#xff0c;利用不太常见的语言如祖鲁语和盖尔语可以绕过各种限制。研究人员测试了GPT-4对…

gitlab docker部署,备份,恢复。附踩坑记录

本次安装在CentOS7下进行 1、安装yum 检查是否已经安装yum yum --version如果未安装 sudo yum install -y yum-utils添加镜像源&#xff1a; 国外镜像源&#xff1a;yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo阿里镜像源&am…

【VIM TMUX】开发工具 Vim 在 bash 中的显示与 tmux 中的显示不同

开发工具 Vim 在 bash 中的显示与 tmux 中的显示不同-CSDN博客 此方法有效 方法如下&#xff1a; 1.在~/.bashrc中添加 alias tmuxtmux -2 ,然后使配置生效 $source ~/.bashrc . 2.在~/.tmux.conf中添加 set -g default-terminal "screen-256color" 完成之后即可…

最新AI创作系统ChatGPT源码+详细搭建部署教程,支持AI绘画/支持OpenAI-GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

SQL 的优化

SQL 优化是指对数据库查询语句进行优化&#xff0c;以提高查询性能和效率。下面列出了一些常见的 SQL 优化技巧&#xff1a; 1、索引优化 &#xff08;1&#xff09;使用适当的索引来加速查询操作。在频繁用于查询的列上创建索引&#xff0c;特别是在 WHERE 条件、JOIN 条件和…

AOMEI PXE Boot Free

两台电脑网线直连&#xff0c;不用设置固定IP&#xff0c;该软件包含DHCP。 名称: 3H3AOMEIPXEBootFree.rar 大小: 13068734 字节 (12 MiB) SHA1: 1e606c8c1ee3badf8af9a87f61fdf2e332b773e6 名称: PXEBoot.exe 大小: 13124928 字节 (12 MiB) SHA1: 95286ac18e9b81c2a68412c40…

[Go]配置国内镜像源

配置 Windows 选一个 go env -w GOPROXYhttps://goproxy.cn,direct go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy,direct查看环境配置 go env

Uniapp路由拦截-自定义路由白名单

步骤一:新建routerIntercept.js文件 步骤二:routerIntercept文件中写入:(根据自己需要修改whiteList白名单中的页面路径和自己的逻辑处理) import Vue from vue // 白名单 const whiteList = [/pages/public/login,/pages/public/privacyAgreement, ]export default asy…

代理IP在保护跨境商家网络安全中的重要作用

在当前全球化的背景下&#xff0c;跨境电商成为一种重要的商业模式&#xff0c;越来越多的商家涌入国际市场&#xff0c;商家们通过互联网平台将商品远销国外&#xff0c;但网络安全风险随之而来。跨境商家因为需要处理大量的在线交易和产品数据&#xff0c;如果未能对这些敏感…

linux更换常用软件的默认缓存路径(.conda, .huggingface等)

在使用linux的过程中&#xff0c;我们往往会使用软件安装很多packages&#xff0c;其中的大多数软件&#xff08;例如conda&#xff09;会把当前安装的packages缓存起来&#xff0c;以加速之后的相同package的安装。 而很多软件的默认缓存路径是user自己的home路径。下面罗列几…

SSMS中的SQL sever代理

目录 一、用途&#xff1a; 二、用法 SQL Server代理&#xff08;SQL Server Agent&#xff09;是SQL Server Management Studio (SSMS) 2008中的一个功能模块&#xff0c;它用于执行和调度自动化任务、作业和脚本&#xff0c;如作业和警报。SQL Server代理允许在指定的时间间…

day27--AJAX(bootstrap之modal,toast;接口文档的一些用法;AJAX原理)

目录 Bootstrap之Modal&#xff1a; 显示和隐藏方法 通过自定义属性&#xff1a; 使用JS来控制弹框&#xff1a; Bootstrap之Toast&#xff1a; 接口文档一些用法&#xff1a; 删除图书&#xff1a; 图片上传&#xff1a; 图片上传步骤&#xff1a; 修改头像&#xf…

CVE-2017-15715 apache换行解析文件上传漏洞

影响范围 httpd 2.4.0~2.4.29 复现环境 vulhub/httpd/CVE-2017-15715 docker-compose 漏洞原理 在apache2的配置文件&#xff1a; /etc/apache2/conf-available/docker-php.conf 中&#xff0c;php的文件匹配以正则形式表达 ".php$"的正则匹配模式意味着以.ph…

Spring Boot集成kafka的相关配置

引入依赖&#xff1a; 额外依赖只需要这一个&#xff0c;kafka-client 不是springboot 的东西&#xff0c;那是原生的 kafka 客户端&#xff0c; kafka-test也不需要&#xff0c;是用代码控制broker的东西。 <dependency><groupId>org.springframework.kafka</g…