Java实现微信支付、退款(小程序支付JSAPI |
您所在的位置:网站首页 › java微信小程序支付流程 › Java实现微信支付、退款(小程序支付JSAPI |
一、废话不多说,直接上教程:
写代码之前首先要明白微信支付的支付流程。 二、支付流程:小程序调用后端预支付接口 => 预支付接口调用成功返回给小程序支付凭证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.配置微信支付前必要的密钥和商户信息 资源文件配置:查看官方文档,查看调用微信支付时需要传哪些必传的参数。 由于使用的这个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 |