【微信支付】小微商戶進件 接口分析與源碼實現


一、小微商戶能力介紹 (摘自 微信小微商戶介紹

1. 快速進件

2. 支持零錢、借記卡、信用卡支付方式

3. 交易手續費支持11檔枚舉值

4. 每日結算款T+1日自動提現至商戶個人銀行卡

具體不多說了,請看官方文檔。

小微商戶進件接口的開放大大降低成為微信支付商戶的門檻,當然前提是提供服務者擁有微信支付服務商身份。

具體接口操作步驟如下(本文代碼用的是WxJava相關的類庫,githhub地址:https://github.com/Wechat-Group/WxJava):

第一步:申請入駐接口

這里相應的 WxPayMicroSubmitRequest,與 WxPayMicroSubmitResult 等都是根據相關接口整合出來的,這里不再詳細描述

 public R wxMicroSubmit(@RequestBody WxPayMicroSubmitRequest wxPayMicroSubmitRequest) throws Exception {
        //構造riskGetcertficatesRequest
        WxPayRiskGetcertficatesRequest riskGetcertficatesRequest = new WxPayRiskGetcertficatesRequest(WxPayConstants.SignType.HMAC_SHA256);
        riskGetcertficatesRequest.checkAndSign(wxPayService.getConfig());

        //請求證書序列號 cert_sn
        String certSnUrl = wxPayService.getPayBaseUrl() + "/risk/getcertficates";
        String certSnResponseContent = wxPayService.post(certSnUrl,riskGetcertficatesRequest.toXML(),false);
        WxPayRiskGetcertficatesResult wxPayRiskGetcertficatesResult = WxPayRiskGetcertficatesResult.fromXML(certSnResponseContent,WxPayRiskGetcertficatesResult.class);

        /**
         * 填充 wxPayMicroSubmitRequest 字段
         */
        //平台證書序列號
        wxPayMicroSubmitRequest.setCertSn(wxPayRiskGetcertficatesResult.getCertSn());
        //業務申請編號 micro + 時間戳
        wxPayMicroSubmitRequest.setBusinessCode("micro" + DateUtils.format(new Date(),"YYYYMMddHHmmssSSS"));
        //費率
        wxPayMicroSubmitRequest.setRate("0.6%");

        //消息加密前 創建SellerMicroSubmitInfoEntity 並賦值
        SellerMicroSubmitInfoEntity sellerMicroSubmitInfoEntity = new SellerMicroSubmitInfoEntity();
        BeanUtils.copyProperties(wxPayMicroSubmitRequest,sellerMicroSubmitInfoEntity);

        //1.敏感信息加密處理
        wxPayMicroSubmitRequest.rsaEncryptField((WxPayServiceImpl)wxPayService);

        //2.調用checkAndSign 補充系統參數
        wxPayMicroSubmitRequest.checkAndSign(wxPayService.getConfig());
        String microSubmitUrl = wxPayService.getPayBaseUrl() + "/applyment/micro/submit";
        String responseContent =  wxPayService.post(microSubmitUrl,wxPayMicroSubmitRequest.toXML(),true);
        WxPayMicroSubmitResult wxPayMicroSubmitResult = WxPayMicroSubmitResult.fromXML(responseContent,WxPayMicroSubmitResult.class);

        if("SUCCESS".equals(wxPayMicroSubmitResult.getReturnCode())){
            //如果請求成功,則保存小微企業申請數據
            //設置 applymentId
            sellerMicroSubmitInfoEntity.setApplymentId(wxPayMicroSubmitResult.getApplymentId());
            //保存
            sellerMicroSubmitInfoService.saveOrUpdate(sellerMicroSubmitInfoEntity);

            return R.ok().put("wxPayMicroSubmitResult",wxPayMicroSubmitResult);
        } else{
            return R.error(wxPayMicroSubmitResult.getReturnMsg()).put("wxPayMicroSubmitResult",wxPayMicroSubmitResult);
        }
    }

 

申請注入接口需要幾個前提接口這里一並都列一下:

1.平台證書及序列號獲取接口

2.圖片上傳接口

3.敏感信息加密

第一個接口上面的代碼已經實現,這里專講第二個

圖片上傳接口  

下面是 示例代碼:

public R uploadMedia(@RequestParam("media") MultipartFile media, WxPayUploadmMediaRequest wxPayUploadmMediaRequest) throws IOException, WxPayException {
        String uploadMediaUrl = this.wxService.getPayBaseUrl() + "/secapi/mch/uploadmedia";
        //強轉成子類
        WxPayServiceImpl wxPayService = (WxPayServiceImpl)this.wxService;

        //計算文件哈希
        String medisHash = md5HashCode(media.getInputStream());

        //設置文件哈希
        wxPayUploadmMediaRequest.setMediaHash(medisHash);

        //微信支付簽名
        wxPayUploadmMediaRequest.setSignType(WxPayConstants.SignType.HMAC_SHA256);
        wxPayUploadmMediaRequest.checkAndSign(this.wxService.getConfig());

        //創建httpClient
        HttpClientBuilder httpClientBuilder = wxPayService.createHttpClientBuilder(true);

        HttpPost httpPost = wxPayService.createHttpPost(uploadMediaUrl);
        MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
        // 文件流
        multipartEntityBuilder.addTextBody("mch_id", wxPayUploadmMediaRequest.getMchId(), ContentType.MULTIPART_FORM_DATA);
        multipartEntityBuilder.addBinaryBody("media", media.getInputStream(), ContentType.IMAGE_JPEG, media.getOriginalFilename());
        multipartEntityBuilder.addTextBody("media_hash", wxPayUploadmMediaRequest.getMediaHash(), ContentType.MULTIPART_FORM_DATA);
        multipartEntityBuilder.addTextBody("sign_type", wxPayUploadmMediaRequest.getSignType(), ContentType.MULTIPART_FORM_DATA);
        multipartEntityBuilder.addTextBody("sign", wxPayUploadmMediaRequest.getSign(), ContentType.MULTIPART_FORM_DATA);

        HttpEntity entity = multipartEntityBuilder.build();
        httpPost.setEntity(entity);
        httpPost.addHeader(HTTP.CONTENT_TYPE, "multipart/form-data; charset=UTF-8");

        WxPayUploadMediaResult wxPayUploadMediaResult = null;
        try(CloseableHttpClient httpClient = httpClientBuilder.build()){
            CloseableHttpResponse response = httpClient.execute(httpPost);
            String responseString = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
            wxPayUploadMediaResult = WxPayUploadMediaResult.fromXML(responseString,WxPayUploadMediaResult.class);
            this.log.info("\n【請求地址】:{}\n【請求數據】:{}\n【響應數據】:{}", uploadMediaUrl, "", responseString);

        }
        catch (Exception e) {
            throw new WxPayException(e.getMessage(), e);
        }
        finally {
            httpPost.releaseConnection();
        }

        //this.wxService.post()
        return R.ok().put("mediaId",wxPayUploadMediaResult.getMediaId());
    }

    public static String md5HashCode(InputStream fis) {
        try {
            MessageDigest MD5 = MessageDigest.getInstance("MD5");
            byte[] buffer = new byte[8192];
            int length;
            while ((length = fis.read(buffer)) != -1) {
                MD5.update(buffer, 0, length);
            }
            return new String(Hex.encodeHex(MD5.digest()));
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

注意這里的multipartEntityBuilder相關配置  很容易出錯 

 

關於第三個敏感數據加密這個地方一定要注意一下,要先根據平台證書解密指引 這個接口 解密出來public_key 然后才能成功調用加密方法,官方有示例代碼這里就不示例了 。

 

最后寫一下查詢進件的狀態接口:

接口傳入  applymentId 或者 businessCode

public R wxMicroGetstate(@RequestBody WxPayMicroGetStateRequest wxPayMicroGetStateRequest) throws WxPayException {

        wxPayMicroGetStateRequest.checkAndSign(wxPayService.getConfig());
        String microSubmitUrl = wxPayService.getPayBaseUrl() + "/applyment/micro/getstate";
        String responseContent =  wxPayService.post(microSubmitUrl,wxPayMicroGetStateRequest.toXML(),true);
        WxPayMicroGetStateResult wxPayMicroGetStateResult = WxPayMicroGetStateResult.fromXML(responseContent,WxPayMicroGetStateResult.class);

        //判斷是否審核通過
        if("SUCCESS".equals(wxPayMicroGetStateResult.getReturnCode()) && "SUCCESS".equals(wxPayMicroGetStateResult.getResultCode())){
            //如果通過則...
            return R.ok().put("wxPayMicroGetStateResult",wxPayMicroGetStateResult);
        }
        return R.error(wxPayMicroGetStateResult.getReturnMsg()).put("wxPayMicroGetStateResult",wxPayMicroGetStateResult);
    }

 


免責聲明!

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



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