一、小微商戶能力介紹 (摘自 微信小微商戶介紹)
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); } }
申請注入接口需要幾個前提接口這里一並都列一下:
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); }
