Java 后端微信支付demo


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 }

六、至此,后端代碼已經結束,前端拿到返回值調用微信發起支付接口就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM