Java整合微信支付
Java结合微信支付
1.起先的打算是根据微信支付的官方文档来一步步的去操作,但是因为时间与效率的问题还是使用了集成的框架,话不多说,直接开干。
<properties> <weixin-java.version>4.3.0</weixin-java.version> </properties> <dependencies> //github bianrywang 可以去看看他做的微信支付 用的就是这个 <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-miniapp</artifactId> <version>${weixin-java.version}</version> </dependency> // hutool工具包 不多说 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.8</version> </dependency> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-pay</artifactId> <version>${weixin-java.version}</version> </dependency> </dependencies>
properties格式
#微信支付相关参数 wxpay.mch-id= #商户API证书序列号 wxpay.mch-serial-no= #私钥 wxpay.private-key-path=apiclient_key.pem wxpay.key-path=apiclient_cert.p12 wxpay.private-cert-path=apiclient_cert.pem #APIv3密钥 wxpay.api-v3-key= wxpay.appid= #微信服务器地址 wxpay.domain=https://api.mch.weixin.qq.com #接收结果通知地址 wxpay.notify-domain=https://7d92-115-171-63-135.ngrok.io
yml格式
#微信支付相关参数 wechat: pay: mchid: #商户API证书序列号 mch-serial-no: #私钥 证书 private-key-path=apiclient_key.pem key-path=apiclient_cert.p12 private-cert-path=apiclient_cert.pem #APIv3密钥 api-v3-key: appid: #微信服务器地址 domain: https://api.mch.weixin.qq.com #接收结果通知地址 notify-domain: https://7d92-115-171-63-135.ngrok.io
直接写类里面
import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; public class WxPayUtil { public static WxPayService getWxPayService() { WxPayService payService = new WxPayServiceImpl(); WxPayConfig payConfig = new WxPayConfig(); payConfig.setAppId(""); payConfig.setMchId(""); payConfig.setApiV3Key(""); payConfig.setKeyPath("apiclient_cert.p12");//p12 payConfig.setPrivateKeyPath("apiclient_key.pem");//私钥 payConfig.setPrivateCertPath("apiclient_cert.pem");//证书 payConfig.setUseSandboxEnv(false); payService.setConfig(payConfig); return payService; } }
//explain:所需参数 Payer、Amount、Description、OutTradeNo、TimeExpire、NotifyUrl。 //explain: /* Payer:openid 支付人id Amount:Total:总额 单位分 Currency :货币 CNY是人民币 Description:商品描述 OutTradeNo:商品单号 TimeExpire:过期时间 格式要注意,可以和我这个一样 NotifyUrl:回调函数 url一定是个外网可以访问的地址,不要搞权限什么的,做个内网穿透就行 这一条就是调用接口了,我用的是apiV3的认证,所以直接用这个createOrderV3,里面可以debug看一下,有证书认证等,预付款之类的 payService.createOrderV3(TradeTypeEnum.JSAPI, request); */
public Map payOrder(){ Map map = new HashMap<>(); WxPayService payService = WxPayUtil.getWxPayService(); try { WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request(); WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer(); payer.setOpenid(); WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount(); amount.setTotal(); amount.setCurrency("CNY"); request.setDescription(); request.setOutTradeNo(); Date nowDate = new Date(); Date dateAfter = new Date(nowDate.getTime() + 300000); String format = DateUtil.format(dateAfter, "yyyy-MM-dd'T'HH:mm:ssXXX"); request.setTimeExpire(format); request.setNotifyUrl(""); request.setAmount(); request.setPayer(); map.put("data", payService.createOrderV3(TradeTypeEnum.JSAPI, request)); return R.data(map); } catch (Exception e) { System.out.println("微信支付失败!订单号:{} " + feeOrder.getOrderNo() + ",原因:{}" + e.getMessage()); e.getStackTrace(); map.put("data", "支付失败,请稍后重试!"); } return R.data(map);
}
public Map payRefund(){
Map map = new HashMap<>(); try { WxPayService wxPayService = WxPayUtil.getWxPayService(); WxPayRefundV3Request request = new WxPayRefundV3Request(); com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request.Amount amount = new WxPayRefundV3Request.Amount(); //退款单号 自己生成的单号 request.setOutTradeNo(); //使用内部单号 request.setOutRefundNo(); amount.setCurrency("CNY"); amount.setRefund(); amount.setTotal(); request.setAmount(amount); //退款原因 request.setReason(); map.put("data", wxPayService.refundV3(request)); return map; } catch (WxPayException e) { e.getMessage(); map.put("data", "退款失败,请稍后重试!"); } return map;
}
@ApiOperation(value = "微信支付回调函数") @PostMapping("payResult") public R payResult() { WxPayService payService = WxPayUtil.getWxPayService(); HttpServletRequest request = WebUtil.getRequest(); SignatureHeader header = new SignatureHeader(); header.setTimeStamp(request.getHeader("Wechatpay-Timestamp")); header.setNonce(request.getHeader("Wechatpay-Nonce")); header.setSignature(request.getHeader("Wechatpay-Signature")); header.setSerial(request.getHeader("Wechatpay-Serial")); Map map = new HashMap(); try { String requestBody = WebUtil.getRequestBody(request.getInputStream()); map.put("data", payService.parseOrderNotifyV3Result(requestBody, header)); return R.data(map); } catch (Exception e) { e.printStackTrace(); } return R.data(map); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY