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