Java 后端微信支付demo
一、導入微信SDK
二、在微信商戶平台下載證書放在項目的resources目錄下的cert文件夾下(cert文件夾需要自己建)
三、實現微信的WXPayConfig接口
1 package com.ieou.demo.common; 2 3 4 import com.github.wxpay.sdk.WXPayConfig; 5 import org.apache.commons.io.IOUtils; 6 7 import java.io.ByteArrayInputStream; 8 import java.io.InputStream; 9 10 /** 配置我們自己的信息 */ 11 12 public class OurWxPayConfig implements WXPayConfig { 13 14 /** 加載證書 這里證書需要到微信商戶平台進行下載*/ 15 private byte [] certData; 16 17 public OurWxPayConfig() throws Exception{ 18 InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("cert/wxpay/apiclient_cert.p12"); 19 this.certData = IOUtils.toByteArray(certStream); 20 certStream.close(); 21 } 22 23 /** 設置我們自己的appid 24 * 商戶號 25 * 秘鑰 26 * */ 27 28 @Override 29 public String getAppID() { 30 return "wx7494893843843c"; 31 } 32 33 @Override 34 public String getMchID() { 35 return "4672984344"; 36 } 37 38 @Override 39 public String getKey() { 40 return "qbH5l4N3468798dfgK"; 41 } 42 43 @Override 44 public InputStream getCertStream() { 45 return new ByteArrayInputStream(this.certData); 46 } 47 48 @Override 49 public int getHttpConnectTimeoutMs() { 50 return 0; 51 } 52 53 @Override 54 public int getHttpReadTimeoutMs() { 55 return 0; 56 } 57 }
四、構建自己的參數
package com.ieou.demo.common; import java.math.BigDecimal; public class WxpayParam { /** 微信支付的金額是String類型 並且是以分為單位 * 下面舉個例子單位是元是怎么轉為分的 * */ BigDecimal totalPrice = new BigDecimal(1); //此時的單位是元 private String body = "xxx等商品信息"; private String totalFee = totalPrice.multiply(new BigDecimal(100)).toBigInteger().toString(); /** 隨機數字字符串*/ private String outTradeNo = "4784984230432842944"; public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getTotalFee() { return totalFee; } public void setTotalFee(String totalFee) { this.totalFee = totalFee; } public String getOutTradeNo() { return outTradeNo; } public void setOutTradeNo(String outTradeNo) { this.outTradeNo = outTradeNo; } }
五、配置微信統一下單接口需要的參數,並調用微信統一下單接口
1 package com.ieou.demo.controller; 2 3 import com.github.wxpay.sdk.WXPay; 4 import com.github.wxpay.sdk.WXPayUtil; 5 import com.ieou.demo.common.OurWxPayConfig; 6 import com.ieou.demo.common.WxpayParam; 7 import org.springframework.web.bind.annotation.GetMapping; 8 import org.springframework.web.bind.annotation.RequestMapping; 9 import org.springframework.web.bind.annotation.RestController; 10 11 import java.util.HashMap; 12 import java.util.Map; 13 14 15 @RestController 16 @RequestMapping("/") 17 public class WxPayController { 18 19 @GetMapping("/pay") 20 public Map<String,String> wxPayFunction() throws Exception{ 21 22 WxpayParam wxpayParam = new WxpayParam(); 23 String notifyUrl = "www.baidu.com"; //我這里的回調地址是隨便寫的,到時候需要換成處理業務的回調接口 24 25 OurWxPayConfig ourWxPayConfig = new OurWxPayConfig(); 26 WXPay wxPay = new WXPay(ourWxPayConfig); 27 28 //根據微信支付api來設置 29 Map<String,String> data = new HashMap<>(); 30 data.put("appid",ourWxPayConfig.getAppID()); 31 data.put("mch_id",ourWxPayConfig.getMchID()); //商戶號 32 data.put("trade_type","APP"); //支付場景 APP 微信app支付 JSAPI 公眾號支付 NATIVE 掃碼支付 33 data.put("notify_url",notifyUrl); //回調地址 34 data.put("spbill_create_ip","127.0.0.1"); //終端ip 35 data.put("total_fee",wxpayParam.getTotalFee()); //訂單總金額 36 data.put("fee_type","CNY"); //默認人民幣 37 data.put("out_trade_no",wxpayParam.getOutTradeNo()); //交易號 38 data.put("body",wxpayParam.getBody()); 39 data.put("nonce_str","bfrhncjkfdkfd"); // 隨機字符串小於32位 40 String s = WXPayUtil.generateSignature(data, ourWxPayConfig.getKey()); //簽名 41 data.put("sign",s); 42 43 /** wxPay.unifiedOrder 這個方法中調用微信統一下單接口 */ 44 Map<String, String> respData = wxPay.unifiedOrder(data); 45 if (respData.get("return_code").equals("SUCCESS")){ 46 47 //返回給APP端的參數,APP端再調起支付接口 48 Map<String,String> repData = new HashMap<>(); 49 repData.put("appid",ourWxPayConfig.getAppID()); 50 repData.put("mch_id",ourWxPayConfig.getMchID()); 51 repData.put("prepayid",respData.get("prepay_id")); 52 repData.put("package","WXPay"); 53 repData.put("noncestr",respData.get("nonce_str")); 54 repData.put("timestamp",String.valueOf(System.currentTimeMillis()/1000)); 55 String sign = WXPayUtil.generateSignature(repData,ourWxPayConfig.getKey()); //簽名 56 respData.put("sign",sign); 57 respData.put("timestamp",repData.get("timestamp")); 58 respData.put("package","WXPay"); 59 return respData; 60 } 61 throw new Exception(respData.get("return_msg")); 62 } 63 }
六、至此,后端代碼已經結束,前端拿到返回值調用微信發起支付接口就可以了。