Java 微信支付统一下单、支付回调、订单查询实现

首先,参考文档:

【微信支付】H5支付开发文档
Java 后端微信支付demo

  1. 引入jar包
		<dependency><groupId>com.github.wxpaygroupId><artifactId>wxpay-sdkartifactId><version>0.0.3version>dependency>
  1. 配置申请好的AppId,MchId, Key

这里只需要统一下单、支付回调以及查询订单,所以不需要加载证书

import com.github.wxpay.sdk.WXPayConfig;import java.io.InputStream;/** 配置我们自己的信息  */public class WxPayConfig implements WXPayConfig {//    /** 加载证书  这里证书需要到微信商户平台进行下载*/
//    private byte [] certData;
//
//    public WxPayConfig() throws  Exception{
//        InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("../cert/pay/apiclient_cert.p12");
//        this.certData = IOUtils.toByteArray(certStream);
//        certStream.close();
//    }/** 设置我们自己的appid* 商户号* 秘钥* */@Overridepublic String getAppID() {return "###AppId";}@Overridepublic String getMchID() {return "###MchId";	}@Overridepublic String getKey() {return "###Key";}@Overridepublic InputStream getCertStream() {return null;}@Overridepublic int getHttpConnectTimeoutMs() {return 0;}@Overridepublic int getHttpReadTimeoutMs() {return 0;}
}
  1. 统一下单接口示例:
 	// 微信支付下单@PreAuthorize("@el.check('anonymous')") // 匿名访问@PostMapping("/prePay")public ResponseEntity placeOrder(HttpServletRequest request, @RequestBody Map params) throws Exception {// 保存订单并返回订单号 shopOrderDTO.getId()// 处理请求参数WxPayConfig wxPayConfig = new WxPayConfig();WXPay wxPay = new WXPay(wxPayConfig);String url = "###公网地址";String notifyUrl = url + "/payReturn";	// 微信支付回调地址,详情参考微信官方文档要求Map<String,String> data = new HashMap<>();data.put("out_trade_no", shopOrderDTO.getId()+"");   //订单编号data.put("total_fee",params.get("total_free").toString());   //金额(单位为分) intdata.put("attach", new JSONObject().toJSONString(attach));  //附加数据:{nums:1, device_id:"0x234143", store_id:10000000}data.put("appid",wxPayConfig.getAppID());data.put("mch_id",wxPayConfig.getMchID());data.put("trade_type","MWEB");	// h5支付固定写法data.put("device_info","WEB"); // h5支付固定写法data.put("notify_url",notifyUrl);data.put("spbill_create_ip", IPUtil.getIPAddress(request));data.put("fee_type","CNY");data.put("body","###支付信息描述");data.put("nonce_str", WXPayUtil.generateNonceStr()); data.put("scene_info", "###参考官方文档");// 生成签名String s = WXPayUtil.generateSignature(data, wxPayConfig.getKey());data.put("sign",s);// 发起下单请求Map<String, String> respData = wxPay.unifiedOrder(data);// 处理下单结果if (respData.get("return_code").equals("SUCCESS")){if (respData.get("result_code").equals("SUCCESS")) {respData.put("out_trade_no", shopOrderDTO.getId()+"");return new ResponseEntity<>(respData, HttpStatus.OK);} else {// 下单失败的处理 如保存日志throw new Exception(respData.get("err_code_des"));}} else {// 下单失败的处理 如保存日志throw new Exception(respData.get("return_msg"));}}
  1. 支付回调接口
    // 微信支付回调@PreAuthorize("@el.check('anonymous')")@RequestMapping("/payReturn")public String payReturn(HttpServletRequest request, HttpServletResponse response) throws Exception {// logger.info("微信支付回调:");WxPayConfig wxPayConfig = new WxPayConfig();WXPay wxPay = new WXPay(wxPayConfig);// 接收请求参数InputStream inStream = request.getInputStream();ByteArrayOutputStream outSteam = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inStream.read(buffer)) != -1) {outSteam.write(buffer, 0, len);}String xml = new String(outSteam.toByteArray(), "utf-8");// 转为MapMap<String, String> params = WXPayUtil.xmlToMap(xml);outSteam.close();inStream.close();// 验证签名if (wxPay.isResponseSignatureValid(params)) { if (params.get("return_code").equals("FAIL")) {shopLogService.anonymousCreate(shopLogService.getShopLog(null, null, "支付发起失败",params.get("return_msg") + "" ));} else if (params.get("return_code").equals("SUCCESS")){if (params.get("result_code").equals("FAIL")) {// 支付失败} else if (params.get("result_code").equals("SUCCESS")) {// 查询订单,将支付返回结果与订单保存信息对比ShopOrderDTO orderDTO = shopOrderService.findById(Long.valueOf(params.get("out_trade_no")));	// 判断金额、订单支付状态、支付结果if (orderDTO.getAmount() == Integer.valueOf(params.get("total_fee")) && orderDTO.getState() == 1&& !StringUtils.isBlank(params.get("transaction_id"))) {// 修改订单状态为已支付 省略return "\n" +"  \n" +"  \n" +"";} else if (StringUtils.isBlank(params.get("transaction_id"))){// 支付ID为空} else if (orderDTO.getState() == 0){// 订单状态为已支付} else if (orderDTO.getAmount() != Integer.valueOf(params.get("total_fee"))){// 支付金额与订单金额不相等}}}}return "";}
  1. 查询订单接口
    // 微信支付查询 参数是订单id@PreAuthorize("@el.check('anonymous')")@RequestMapping("/paySearch")public Map paySearch(String id) throws Exception {// 查询订单ShopOrderDTO orderDTO = shopOrderService.findById(Long.valueOf(id));// 如果订单已支付且支付id不为空,可以直接返回结果if (orderDTO.getState() == 0 && !StringUtils.isBlank(orderDTO.getPayId())) {Map<String, String> result = new HashMap<>();result.put("return_code", "SUCCESS");result.put("result_code", "SUCCESS");result.put("trade_state", "SUCCESS");return result;} else {// 处理参数WxPayConfig wxPayConfig = new WxPayConfig();WXPay wxPay = new WXPay(wxPayConfig);Map<String,String> data = new HashMap<>();data.put("out_trade_no", id);   //订单编号data.put("appid",wxPayConfig.getAppID());data.put("mch_id",wxPayConfig.getMchID());data.put("nonce_str", WXPayUtil.generateNonceStr()); // 签名String s = WXPayUtil.generateSignature(data, wxPayConfig.getKey());data.put("sign",s);// 发起查询Map<String, String> result = wxPay.orderQuery(data);// 如果用户已支付if (result.get("return_code").equals("SUCCESS") && result.get("result_code").equals("SUCCESS") && result.get("trade_state").equals("SUCCESS")) {// 修改订单支付状态和支付id}return result;}}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部