微信支付分(四)--------完結微信支付分訂單以及簽名


在此講明,此調微信支付分接口文檔,可通用於微信支付分的所有調用支付分接口,在此就只寫一次為例!!!!!!!!

一.在做完結支付分訂單我們需要了解以下要求

1.商戶系統對於完結微信支付分訂單一定要做簽名,不然會報錯:未簽名。(簽名)

一.后代代碼

 /**
     * 完結支付分訂單
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value = "/completeOrder.do", method = RequestMethod.POST)
    public Map<String, Object> CompleteOrder(@RequestBody Map<String, Object> params, HttpServletRequest request,
                                          HttpServletResponse response) throws Exception {
        setup();
        String url ="https://api.mch.weixin.qq.com/v3/payscore/serviceorder/%OUTORDERNO%/complete";
        url = url .replaceAll("%OUTORDERNO%", "自己的商戶訂單號");

        //簽名
        String result2 = HttpRequest.post(url)
                .header(Header.CONTENT_TYPE,"application/json")
                .header(Header.ACCEPT,"application/json")
                .header("Authorization", "WECHATPAY2-SHA256-RSA2048"+" "
                        + Sign.getToken("POST",url,"驗簽的參數",商戶MCHID,商戶MCHSERIALNO,“商戶私鑰路徑”))//頭信息,多個頭信息多次調用此方法即可
                .body(reqdata)
                .execute().body();
        System.out.println("result2 = " + result2);
        Map<String,Object> jsonToMap = JSON.parseObject(result2,Map.class);
        after();
        return jsonToMap;
    }


    public void setup() throws IOException {  
        PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(
                new ByteArrayInputStream(你的商戶私鑰.getBytes("utf-8")));
        X509Certificate wechatpayCertificate = PemUtil.loadCertificate(
                new ByteArrayInputStream(你的微信支付平台證書.getBytes("utf-8")));

        ArrayList<X509Certificate> listCertificates = new ArrayList<>();
        listCertificates.add(wechatpayCertificate);

        httpClient = WechatPayHttpClientBuilder.create()
                .withMerchant(WX_MCHID, WX_MCHSERIALNO, merchantPrivateKey)
                .withWechatpay(listCertificates)
                .build();
    }

    //	@After
    public void after() throws IOException {
        httpClient.close();
    }

  

//method(請求類型GET、POST url(請求url) body(請求body,GET請求時body傳"",POST請求時body為請求參數的json串)  merchantId(商戶號) certSerialNo(API證書序列號) keyPath(API證書路徑)
    public static String getToken(String method, String url, String body, String merchantId, String certSerialNo, String keyPath) throws Exception {
        String signStr = "";
        HttpUrl httpurl = HttpUrl.parse(url);
//        String nonceStr = getNonceStr();
        String nonceStr = "隨機字符串";
        long timestamp = System.currentTimeMillis() / 1000;
        if (StringUtils.isEmpty(body)) {
            body = "";
        }
        String message = buildMessage(method, httpurl, timestamp, nonceStr, body);
        String signature = sign(message.getBytes("utf-8"), keyPath);
        signStr = "mchid=\"" + merchantId
                + "\",nonce_str=\"" + nonceStr
                + "\",timestamp=\"" + timestamp
                + "\",serial_no=\"" + certSerialNo
                + "\",signature=\"" + signature + "\"";
        LOGGER.info("Authorization Token:" + signStr);
        System.out.println("signStr:--" + signStr);
        return signStr;
    }


    public static String buildMessage(String method, HttpUrl url, long timestamp, String nonceStr, String body) {
        String canonicalUrl = url.encodedPath();
        if (url.encodedQuery() != null) {
            canonicalUrl += "?" + url.encodedQuery();
        }
        return method + "\n"
                + canonicalUrl + "\n"
                + timestamp + "\n"
                + nonceStr + "\n"
                + body + "\n";
    }

    public static String sign(byte[] message, String keyPath) throws Exception {
        Signature sign = Signature.getInstance("SHA256withRSA");
        sign.initSign(getPrivateKey(keyPath));
        sign.update(message);
        return Base64.encodeBase64String(sign.sign());
    }

  

// 你的商戶私鑰


免責聲明!

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



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