Java 後端微信支付demo

業餘草發表於2019-03-12

一、匯入微信SDK

二、在微信商戶平臺下載證照放在專案的resources目錄下的cert資料夾下(cert資料夾需要自己建)

三、實現微信的WXPayConfig介面

package com.ieou.demo.common;


import com.github.wxpay.sdk.WXPayConfig;
import org.apache.commons.io.IOUtils;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

/** 配置我們自己的資訊  */

public class OurWxPayConfig implements WXPayConfig {

    /** 載入證照  這裡證照需要到微信商戶平臺進行下載*/
    private byte [] certData;

    public OurWxPayConfig() throws  Exception{
        InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("cert/wxpay/apiclient_cert.p12");
        this.certData = IOUtils.toByteArray(certStream);
        certStream.close();
    }

    /** 設定我們自己的appid
     * 商戶號
     * 祕鑰
     * */

    @Override
    public String getAppID() {
        return "wx7494893843843c";
    }

    @Override
    public String getMchID() {
        return "4672984344";
    }

    @Override
    public String getKey() {
        return "qbH5l4N3468798dfgK";
    }

    @Override
    public InputStream getCertStream() {
        return new ByteArrayInputStream(this.certData);
    }

    @Override
    public int getHttpConnectTimeoutMs() {
        return 0;
    }

    @Override
    public int getHttpReadTimeoutMs() {
        return 0;
    }
}

四、構建自己的引數

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;
    }
}

五、配置微信統一下單介面需要的引數,並呼叫微信統一下單介面

package com.ieou.demo.controller;

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.ieou.demo.common.OurWxPayConfig;
import com.ieou.demo.common.WxpayParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;


@RestController
@RequestMapping("/")
public class WxPayController {

    @GetMapping("/pay")
    public Map<String,String> wxPayFunction() throws Exception{

        WxpayParam wxpayParam = new WxpayParam();
        String notifyUrl = "www.baidu.com";  //我這裡的回撥地址是隨便寫的,到時候需要換成處理業務的回撥介面

        OurWxPayConfig ourWxPayConfig = new OurWxPayConfig();
        WXPay wxPay = new WXPay(ourWxPayConfig);

        //根據微信支付api來設定
        Map<String,String> data = new HashMap<>();
        data.put("appid",ourWxPayConfig.getAppID());
        data.put("mch_id",ourWxPayConfig.getMchID());         //商戶號
        data.put("trade_type","APP");                         //支付場景 APP 微信app支付 JSAPI 公眾號支付  NATIVE 掃碼支付
        data.put("notify_url",notifyUrl);                     //回撥地址
        data.put("spbill_create_ip","127.0.0.1");             //終端ip
        data.put("total_fee",wxpayParam.getTotalFee());       //訂單總金額
        data.put("fee_type","CNY");                           //預設人民幣
        data.put("out_trade_no",wxpayParam.getOutTradeNo());   //交易號
        data.put("body",wxpayParam.getBody());
        data.put("nonce_str","bfrhncjkfdkfd");   // 隨機字串小於32位
        String s = WXPayUtil.generateSignature(data, ourWxPayConfig.getKey());  //簽名
        data.put("sign",s);
        
        /** wxPay.unifiedOrder 這個方法中呼叫微信統一下單介面 */
        Map<String, String> respData = wxPay.unifiedOrder(data); 
        if (respData.get("return_code").equals("SUCCESS")){

            //返回給APP端的引數,APP端再調起支付介面
            Map<String,String> repData = new HashMap<>();
            repData.put("appid",ourWxPayConfig.getAppID());
            repData.put("mch_id",ourWxPayConfig.getMchID());
            repData.put("prepayid",respData.get("prepay_id"));
            repData.put("package","WXPay");
            repData.put("noncestr",respData.get("nonce_str"));
            repData.put("timestamp",String.valueOf(System.currentTimeMillis()/1000));
            String sign = WXPayUtil.generateSignature(repData,ourWxPayConfig.getKey()); //簽名
            respData.put("sign",sign);
            respData.put("timestamp",repData.get("timestamp"));
            respData.put("package","WXPay");
            return respData;
        }
        throw new Exception(respData.get("return_msg"));
    }
}

六、至此,後端程式碼已經結束,前端拿到返回值呼叫微信發起支付介面就可以了。

640

相關文章