最新版微信小程序支付,退款问题实现与总结(保姆级)

您所在的位置:网站首页 小程序付了钱不能退款 最新版微信小程序支付,退款问题实现与总结(保姆级)

最新版微信小程序支付,退款问题实现与总结(保姆级)

2024-07-08 03:59:21| 来源: 网络整理| 查看: 265

1.了解微信支付逻辑

说白了就是我们去调用微信官方提供的接口,但是这些接口有很多繁琐的参数,还需要计算签名等等一系列恶心的步骤,详情可以看微信官网,我们可以用微信官方提供的sdk,也可以用github上的三方sdk,本文以GitHub上大佬binaryWang的微信支付sdk演示微信支付的实现

前言

首先我们作为后端,需要像前端提供一个接口,前端通过调用这个接口唤起下单,在这个接口中,后端回去调用微信下单接口,这时候微信会给我们返一个预支付id,我们通过这个预支付的id,

这个预支付id是唤起下单的一个必填参数,咱们只需要计算出唤起支付所需要的参数,然后传给前端,前端就可以调用这个唤起支付接口,这样,输入密码的数字轮盘就出来了

注意事项:

sdk的版本可能会影响sign的计算,导致输入支付密码后,微信提示sign鉴权失败,这里的sdk大佬们都在维护的,只需要更新到最新版本即可

2.微信支付需要的参数

mchKey:新版本更新后叫做v2密钥,作用是处理签名信息解密,在微信支付商户平台申请,为32为密钥,自行设定,需要绑定商户的手机号进行短信验证和操作码验证

keyPath: classpath:wxcert/apiclient_cert.p12

#apiclient_key.pem证书文件的绝对路径或者以classpath:开头的类路径.

privateKeyPath: classpath:wxcert/apiclient_key.pem

#apiclient_cert.pem证书文件的绝对路径或者以classpath:开头的类路径.

privateCertPath: classpath:wxcert/apiclient_cert.pem

需要在api管理这里设置证书,在指引处可以下载证书

注:密钥,是开发者自己生成,生成后配置到商户平台即可

下载证书工具;下载后,双击“WXCertUtil.exe”文件,选择安装路径后,点击申请证书

也可通过以下链接下载证书工具:

windows版本 :https://wx.gtimg.com/mch/files/WXCertUtil.exe

mac版本 :https://wx.gtimg.com/mch/files/WXCertUtil.dmg

3.实现微信支付

导入依赖,并配置wx所需参数

com.github.binarywang weixin-java-pay 4.6.0

订单支付

/** * 订单微信支付 * @param paymentForm * @return */ @Override public T payOrder(OrderPaymentForm paymentForm,Long memberId) { //获取订单号 String orderSn = paymentForm.getOrderSn(); //通过该订单号查询订单对象 Order order = orderService.getOne(new LambdaQueryWrapper().eq(Order::getOrderCode, orderSn)); log.info("appid---"+paymentForm.getAppId()); Assert.isTrue(order!=null,"该订单信息不存在"); Assert.isTrue(OrderStatusEnum.UNPAID.getValue().equals(order.getState()), "订单不可支付,请检查订单状态"); RLock lock = redissonClient.getLock(OrderConstants.ORDER_LOCK_PREFIX + order.getOrderCode()); try { lock.lock(); T result; result = (T) wxJsapiPay(paymentForm.getAppId(), order.getOrderCode(), order.getAmount(),memberId); return result; } finally { //释放锁 if (lock.isLocked()) { lock.unlock(); } } }

掉起订单支付

/** * 微信支付调起 * * @param appId 微信小程序ID * @param orderSn 订单编号 * @param paymentAmount 支付金额 * @return 微信支付调起参数 */ private WxPayUnifiedOrderV3Result.JsapiResult wxJsapiPay(String appId, String orderSn, BigDecimal paymentAmount,Long memberId) { //价格转换为分 Long longValueAmount = BigDecimal2Long(paymentAmount); //获取用户OpenId String memberOpenId = memberService.getById(memberId).getOpenid(); WxPayUnifiedOrderV3Request wxRequest = new WxPayUnifiedOrderV3Request() .setAppid(appId)//小程序appId .setOutTradeNo(orderSn)//设置订单号 .setAmount(new WxPayUnifiedOrderV3Request .Amount() .setTotal(Math.toIntExact(longValueAmount)). setCurrency(wxPayProperties.getCurrency()) )//设置金额 .setPayer( new WxPayUnifiedOrderV3Request.Payer() .setOpenid(memberOpenId) )//设置付款人 .setDescription("赅买-订单编号:" + orderSn) .setNotifyUrl(wxPayProperties.getPayNotifyUrl()); WxPayUnifiedOrderV3Result.JsapiResult jsapiResult; try { jsapiResult = wxPayService.createOrderV3(TradeTypeEnum.JSAPI, wxRequest); } catch (WxPayException e) { log.error(e.getMessage(), e); throw new BizException(e.getMessage()+"微信统一下单异常"); } log.info("----------------------"+jsapiResult); return jsapiResult; }

返回值

实现效果

在用户输入密码成功后,这块微信就支付成功了,这时候我们需要暴露给微信一个开发的回调接口,微信这边会传入一些加密参数,我们拿到参数后调用api将这些参数解密,最后可以对订单进行一些信息的校验以及状态的更新等操作

4.实现微信退款

具体方式与支付差不多,但这块调用微信退款后,前端只需掉我们的接口,会自动完成退款,我们需要按照微信官方的返回规范,退款成功sucsess,更新订单信息

注:如果微信这块没有接收到返回成功的信息,还会按照一定策略(频繁度从高到底)不断调用我们提供的回调接口,具体调用方式请看微信小程序官方退款接口文档

退款--入参(订单编号,退款金额,退款原因)

/** * 退款 */ public T refundOrder(RefundForm refundForm){ Assert.isTrue(refundForm.getReason()!=null,"退款备注不能为空"); //判断该订单是否未付款,或已取消 //获取商户订单号 String orderCode = refundForm.getOrderCode(); //转金额 Long orderRundAmount = BigDecimal2Long(refundForm.getRefundAmount()); //获取订单信息 Order order = orderService.getOne(new LambdaQueryWrapper().eq(Order::getOrderCode, orderCode)); //获取微信退款单号 String wxPayCode = order.getWxPayCode(); //订单金额 Long orderAmount = BigDecimal2Long(order.getAmount()); Assert.isTrue(order !=null,"查询不到该订单信息,无法退款"); Assert.isTrue(order.getState()==OrderStatusEnum.PAID.getValue() || order.getState()==OrderStatusEnum.REBATES.getValue(),"该订单尚未完成支付或已取消,无法退款"); Assert.isTrue(orderRundAmount.intValue()>0,"退款金额必须大于0"); Assert.isTrue(orderRundAmount


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭