IJPay-All 之 微信支付之app支付

IJPay-All文檔地址

1. maven中引入開發包

        <dependency>
            <groupId>com.github.javen205</groupId>
            <artifactId>IJPay-All</artifactId>
            <version>2.2.0</version>
        </dependency>

2. 創建請求需要的參數類。配置信息在application中

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;

@Data
public class WxPayProperties {
    /**
     * 設置微信公衆號或者小程序等的appid.
     */
    @Value("${wx.pay.appId}")
    private String appId;

    /**
     * 微信支付商戶號.
     */
    @Value("${wx.pay.mchId}")
    private String mchId;

    /**
     * 微信支付商戶密鑰.
     */
    @Value("${wx.pay.mchKey}")
    private String mchKey;

    /**
     * 異步回調地址
     */
    @Value("${wx.pay.notifyUrl}")
    private String notifyUrl;
}

application配置文件 如下
wx:
  pay:
    appId: wx123242342341 # appid
    mchId: 123452123 # 商戶號
    mchKey: U6gG1CqAqwedrfghxH8eMuDrvfXFBokr # 祕鑰 微信商戶平臺(pay.weixin.qq.com)-->賬戶設置-->API安全-->密鑰設置
    notifyUrl: http://169b91h550.imwork.net:35084/wx/wxPayNotice #可以被外網訪問的接口 

3. 創建WxPayProperties實例

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WxConfiguration {

    @Bean("wxPayProperties")
    public WxPayProperties wxPayProperties(){
        return new WxPayProperties();
    }
}

4. 構建請求體,發起統一下單請求 注意:app支付需要二次簽名,很重要

// 構建請求體
Map<String, String> params = UnifiedOrderModel
                .builder()
                .appid(wxPayProperties.getAppId())
                .mch_id(wxPayProperties.getMchId())
                .nonce_str(WxPayKit.generateStr())
                .body("劉志強支付")
                .out_trade_no(WxPayKit.generateStr()))
                .total_fee("100") // 單位是分
                .spbill_create_ip("123.123.123.123") // 終端ip
                .notify_url(wxPayProperties.getNotifyUrl())
                .trade_type(TradeType.APP.getTradeType())
                .build()
                .createSign(wxPayProperties.getMchKey(), SignType.MD5);
// 發送請求
String xmlResult = WxPayApi.pushOrder(false, params);
Map<String, String> resultMap = WxPayKit.xmlToMap(xmlResult);
// 二次簽名
Map<String, String> packageParams = new HashMap<String, String>();
packageParams.put("appid", resultMap.get("appid"));
packageParams.put("partnerid", wxPayProperties.getMchId());
packageParams.put("prepayid", resultMap.get("prepay_id"));
packageParams.put("package", "Sign=WXPay");
packageParams.put("noncestr", resultMap.get("nonce_str"));
packageParams.put("timestamp", System.currentTimeMillis() / 1000 + "");
String packageSign = WxPayKit.createSign(packageParams, wxPayProperties.getMchKey(), SignType.MD5);
packageParams.put("sign", packageSign);
packageParams.put("return_code","SUCCESS");
return packageParams;

5. 將packageParams發送給前端用於調起支付

6. 創建微信異步回調接口,也是在application.yml中配置的notifyUrl

@PostMapping("/wx/wxPayNotice")
public void parseOrderNotifyResult(@RequestBody String xmlData) {
    Map<String, String> resultMap = WxPayKit.xmlToMap(xmlData);
    // 根據resultMap處理訂單業務
}

7. 獲取終端ip的方法

    private String getClientIp() {
        String ipAddress = httpServletRequest.getRemoteAddr();
        if (ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")) {
            //根據網卡獲取本機配置的IP地址
            InetAddress inetAddress = null;
            try {
                inetAddress = InetAddress.getLocalHost();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
            ipAddress = inetAddress.getHostAddress();
        }
        //對於通過多個代理的情況,第一個IP爲客戶端真實的IP地址,多個IP按照','分割
        if (null != ipAddress && ipAddress.length() > 15) {
            if (ipAddress.indexOf(",") > 0) {
                ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
            }
        }
        return ipAddress != null ? ipAddress : "123.12.12.123";
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章