Micro-channel pay - small and micro businesses settled Interface Analysis and source code implementation

A small micro-business capability description (taken from the micro-channel micro-small business description )

1. Fast forward pieces

2. To support change, debit card, credit card payment

3. Transaction fees support 11 file enumeration values

4. The daily settlement amount T + 1 Ri automatic withdrawals to personal bank card business

Specific much to say, see the official documents.

Small and micro businesses into pieces of open interfaces greatly reduce the threshold to become micro-channel pay merchants, of course, provided that the service providers have a micro-channel payment service provider identity.

Specific interfaces steps are as follows (codes used herein are related WxJava library, githhub Address: https://github.com/Wechat-Group/WxJava ):

The first step: applying settled Interface

Where appropriate WxPayMicroSubmitRequest, and the like are integrated WxPayMicroSubmitResult out according to the relevant interface, not described in detail herein

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

        / ** 
         * fill wxPayMicroSubmitRequest field 
         * / 
        // internet certificate serial number 
        wxPayMicroSubmitRequest.setCertSn (wxPayRiskGetcertficatesResult.getCertSn ());
         // Business Application No. micro + stamp 
        wxPayMicroSubmitRequest .setBusinessCode ( "Micro" + DateUtils.format ( new new a Date (), "YYYYMMddHHmmssSSS" ));
         // rates 
        wxPayMicroSubmitRequest.setRate ( "0.6%" ); 

        // message before encryption to create and assign SellerMicroSubmitInfoEntity
        SellerMicroSubmitInfoEntity = SellerMicroSubmitInfoEntity new new SellerMicroSubmitInfoEntity (); 
        BeanUtils.copyProperties (wxPayMicroSubmitRequest, sellerMicroSubmitInfoEntity); 

        // 1. sensitive information encrypted 
        wxPayMicroSubmitRequest.rsaEncryptField ((WxPayServiceImpl) wxPayService); 

        // 2. checkAndSign calling replenishing system parameters 
        wxPayMicroSubmitRequest.checkAndSign (wxPayService. getConfig ()); 
        String microSubmitUrl = wxPayService.getPayBaseUrl () + "/ applyment / Micro / Submit" ; 
        String responseContent = wxPayService.post (microSubmitUrl, wxPayMicroSubmitRequest.toXML (), to true );
        WxPayMicroSubmitResult WxPayMicroSubmitResult = WxPayMicroSubmitResult.fromXML (responseContent, WxPayMicroSubmitResult. Class ); 

        IF ( "SUCCESS" .equals (wxPayMicroSubmitResult.getReturnCode ())) {
             // If the request succeeds, the application data stored small businesses
             // set applymentId 
            sellerMicroSubmitInfoEntity.setApplymentId (wxPayMicroSubmitResult.getApplymentId ());
             // save 
            sellerMicroSubmitInfoService.saveOrUpdate (sellerMicroSubmitInfoEntity); 

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

 

Application interface needs to inject several premises interfaces are listed here along with it:

1. platform interface to obtain the certificate and serial number

2. The image upload Interface

3. sensitive information encrypted

First interface above code has been achieved, here specifically about the second

Picture upload Interface  

The following sample code:

public R & lt uploadMedia (@RequestParam ( "Media") a MultipartFile Media, WxPayUploadmMediaRequest wxPayUploadmMediaRequest) throws IOException, WxPayException { 
        String uploadMediaUrl = the this .wxService.getPayBaseUrl () + "/ secapi / MCH / uploadmedia" ;
         // strong turn into subclasses 
        WxPayServiceImpl = wxPayService (WxPayServiceImpl) the this .wxService; 

        // calculate file hash 
        String medisHash = md5HashCode (media.getInputStream ()); 

        // settings file hash 
        wxPayUploadmMediaRequest.setMediaHash (medisHash); 

        // micro-channel pay signature
        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;
        }
    }

Note that the configuration error prone multipartEntityBuilder 

 

On the third encryption of sensitive data this place must pay attention to it, according to first decrypt the guidance platform certificate  This interface public_key decrypt it before you can successfully call the encryption method, there are official sample code here is not the example.

 

Finally, write about the inquiry into the state of parts of the interface:

Interface Incoming applymentId or 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);
    }

 

Guess you like

Origin www.cnblogs.com/Human-nature/p/11492171.html