Java实现微信支付、退款(小程序支付JSAPI

您所在的位置:网站首页 java微信小程序支付流程 Java实现微信支付、退款(小程序支付JSAPI

Java实现微信支付、退款(小程序支付JSAPI

2024-07-12 12:31| 来源: 网络整理| 查看: 265

一、废话不多说,直接上教程:

写代码之前首先要明白微信支付的支付流程。

二、支付流程:

小程序调用后端预支付接口 => 预支付接口调用成功返回给小程序支付凭证id => 小程序拿到支付凭证调用微信后台支付接口 => 小程序支付成功后,微信后台执行支付回调将支付订单信息返回(预支付调用微信后台是需要传入支付成功后自己本地的回调接口地址,可以在回调接口里设置自己的业务逻辑)

三、退款流程:

服务端自定义设置商户退款单号进行退款申请=>服务端通过微信退款sdk对微信服务器发起验签请求=>退款成功后,微信后台执行退款回调将退款信息返回(退款地址回调微信后台是需要传入退款申请成功后自己本地的回调接口地址,可以在回调接口里设置自己的业务逻辑)

四、官方文档:

微信小程序支付官方文档

如果我们按照微信支付官方文档去一步步写会很慢很繁琐,我教大家使用微信支付官网推荐java-sdk工具包去实现。

微信支付java-sdk工具包

五、开始手撸代码: 1.导入依赖 Gradle: implementation 'com.github.wechatpay-apiv3:wechatpay-java:0.2.11' Maven: com.github.wechatpay-apiv3 wechatpay-java 0.2.11 2.配置微信支付前必要的密钥和商户信息 资源文件配置:

在这里插入图片描述

# 微信小程序支付配置信息 wx: # 微信小程序appid app-id: wx************ # 商户号 mch-id: ************ # 证书序列号 mch-serial-no: ************ # 小程序密钥 app-secret: ************ # apiV3密钥 api-key: ************ # 回调接口地址 notify-url: https://************/wxpay/payNotify # 退款回调接口地址 refund-notify-url: https://************/wxpay/refund/payNotify # 证书地址 key-path: ************/src/main/resources/cert/apiclient_key.pem cert-path: ************/src/main/resources/cert/apiclient_key.pem cert-p12-path: ************/src/main/resources/cert/apiclient_key.pem 获取配置信息: @Component @ConfigurationProperties(prefix = "wx") @Data @ToString public class WxPayV3Bean { private String appId; private String mchId; private String mchSerialNo; private String appSecret; private String apiKey; private String notifyUrl; private String refundNotifyUrl; private String keyPath; } 3.创建接口请求类和返回类

查看官方文档,查看调用微信支付时需要传哪些必传的参数。 在这里插入图片描述

预支付请求类: @Data @Accessors(chain = true) public class WXPayOrderReqVO { @Schema(description = "订单支付类型(1.申请保证金 2. 客户保证金)",required = true) @NotBlank(message = "订单支付类型不能为空!") private String orderType;//附加数据,回调时可根据这个数据辨别订单类型或其他 @Schema(description = "总金额(单位:分)",required = true) @NotNull(message = "总金额不能为空!") private Integer totalPrice; @Schema(description = "商品名称",required = true) @NotBlank(message = "商品名称不能为空!") private String goodsName; @Schema(description = "openid",required = true) @NotBlank(message = "openId不能为空!") private String openId; @Schema(description = "商品订单号",required = true) @NotNull(message = "商品订单号不能为空!") private Long orderSn; } 预退款请求类: @Data @Accessors(chain = true) public class WXRefundOrderReqVO { /** * 微信支付订单号,微信支付订单号和商家订单号二选一 */ @Schema(description = "微信支付订单号") private String transactionId; /** * 商家订单号,对应 out_trade_no, */ @Schema(description = "商家订单号") private String orderId; /** * 商户退款单号,对应out_refund_no */ @Schema(description = "商户退款单号") private String outRefundNo; /** * 退款原因,选填 */ @Schema(description = "退款原因") private String reason; /** * 回调地址 */ @Schema(description = "回调地址") private String notify; /** * 退款金额 */ @Schema(description = "退款金额") private Integer refundMoney; /** * 原订单金额,必填 */ @Schema(description = "原订单金额") private Integer totalMoney; }

由于使用的这个sdk工具类里面有返回类,可以不用自己创建返回类。

这里我自己创了个返回类。

预支付返回类: @Data @Accessors(chain = true) public class WxPayRespVO implements Serializable { private static final long serialVersionUID = 1L; /** * 预支付交易会话标识小程序下单接口返回的prepay_id参数值 */ @Schema(description = "预支付交易会话标识小程序下单接口返回的prepay_id参数值") private String prepayId; /** * 随机字符串 */ @Schema(description = "随机字符串") private String nonceStr; /** * 时间戳 */ @Schema(description = "时间戳") private Long timeStamp; /** * 签名 */ @Schema(description = "签名") private String paySign; } 预退款返回类(可不用): @Data @Accessors(chain = true) public class WXRefundOrderRespVO { /** * 微信支付退款号 */ @Schema(description = "微信支付退款号") private String refundId; /** * 商户退款单号 */ @Schema(description = "商户退款单号") private String outRefundNo; /** * 微信支付订单号 */ @Schema(description = "微信支付订单号") private String transactionId; /** * 商户订单号 */ @Schema(description = "商户订单号") private String outTradeNo; /** * 退款渠道 */ @Schema(description = "退款渠道") private String channel; /** * 退款入账账户 */ @Schema(description = "退款入账账户") private String userReceivedAccount; /** * 退款成功时间 */ @Schema(description = "退款成功时间") private String successTime; /** * 退款创建时间 */ @Schema(description = "退款创建时间") private String createTime; /** * 退款状态 */ @Schema(description = "退款状态") private String status; /** * 资金账户 */ @Schema(description = "资金账户") private String fundsAccount; } 工具类: /** * @project 小程序支付 * @Classname WXPayUtil * @Description TODO * @Author: whl * @CreateTime: 2023-10-16 16:00 */ public class WXPayUtil { //随机字符串设置 private static final String SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static final Random RANDOM = new SecureRandom(); public static String getSign(String signatureStr,String privateKey) throws InvalidKeyException, NoSuchAlgorithmException, SignatureException, IOException, URISyntaxException { //replace 根据实际情况,不一定都需要 String replace = privateKey.replace("\\n", "\n"); PrivateKey merchantPrivateKey = PemUtil.loadPrivateKeyFromPath(replace); Signature sign = Signature.getInstance("SHA256withRSA"); sign.initSign(merchantPrivateKey); sign.update(signatureStr.getBytes(StandardCharsets.UTF_8)); return Base64Utils.encodeToString(sign.sign()); } /** * 获取随机字符串 Nonce Str * * @return String 随机字符串 */ public static String generateNonceStr() { char[] nonceChars = new char[32]; for (int index = 0; index


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3