七 SpringCloud - 微信支付( 二 )

3.2 實現類/** * Created On : 3/11/2022. * <p> * Author : huayu * <p> * Description: 微信支付業務接口實現類 */@Service@Slf4jpublic class WechatPayServiceImpl implements WechatPayService {@Autowiredprivate WechatPayConfig wechatPayConfig;@Overridepublic String generateWxUnifyOrderXmlParams(String productBody,int totalFee) throws Exception {//微信支付接口簽名參數要求//特別注意一下要求規則:參數名ASCII碼從小到大排序(字典排序);如果參數值為空不參與簽名;參數區分大小寫;//定義微信支付解析參數集合:TreeMap(自動橫距集合中key按照字典排序)TreeMap<String, String> paramsMap = new TreeMap<>();//公眾賬號IDappid 必傳參數 微信支付分配的公眾賬號ID(企業號corpid即為此appid)paramsMap.put("appid",wechatPayConfig.getAppId());//商戶號 mch_id微信支付分配的商戶號paramsMap.put("mch_id",wechatPayConfig.getMchId());//設備號 device_info自定義參數,可以為終端設備號(門店號或收銀設備ID) , PC網頁或公眾號內支付可以傳"WEB"paramsMap.put("device_info","WEB");//隨機字符串 nonce_str隨機字符串 , 長度要求在32位以內 。推薦隨機數生成算法paramsMap.put("nonce_str",WechatPayUtil.generateNonceStr());//商品描述 body商品簡單描述,該字段請按照規范傳遞 , 具體請見參數規定paramsMap.put("body",productBody);//附件數據 attachparamsMap.put("attach","課工場KH96");//商戶訂單號 out_trade_no 商戶系統內部訂單號,要求32個字符內(最少6個字符) , 只能是數字、大小寫字母_-|*且在同一個商戶號下唯一 。詳見商戶訂單號paramsMap.put("out_trade_no",WechatPayUtil.generateTradeOrderNo());//標價金額 total_fee 訂單總金額 , 單位為分,詳見支付金額paramsMap.put("total_fee",String.valueOf(totalFee));//終端IP spbill_create_ip 支持IPV4和IPV6兩種格式的IP地址 。用戶的客戶端IPparamsMap.put("spbill_create_ip","121.225.201.22");//通知地址notify_urlbody 異步接收微信支付結果通知的回調地址,通知url必須為外網可訪問的url,不能攜帶參數 。公網域名必須為https , 如果是走專線接入 , 使用專線NAT IP或者私有回調域名可使用httpparamsMap.put("notify_url",wechatPayConfig.getNotifyUri());//交易類型 trade_typeNATIVE -Native 支付 JSAPI -JSAPI支付NATIVE -Native支付APP -APP支付paramsMap.put("trade_type", WechatPayConstant.WECHAT_PAY_TRADE_NATIVE);//商品IDtrade_type=NATIVE時,此參數必傳 。此參數為二維碼中包含的商品ID , 商戶自行定義 。paramsMap.put("product_id","互聯網架構師");//簽名,傳送的sign參數不參與簽名 , 會將生成的簽名與該sign值作校驗 。如果不一致,簽名失敗//切記:簽名都是再確定好接口參數后,指定簽名操作,并將簽名的結果加入參數集合paramsMap.put("sign",WechatPayUtil.generateSignature(paramsMap,wechatPayConfig.getMchKey()));return WechatPayUtil.generateMapToXml(paramsMap);}@Overridepublic Map<String, String> getWchatPayUnifyOrderResult(String unifyOrderXmlParams) throws Exception {//發送post請求,請求微信支付統一下單接口,下預支付訂單,并獲取下單結果String unifyOrderXmlResult = HttpClient4Util.getResponse4PostByString(wechatPayConfig.getOrderUri(), unifyOrderXmlParams, WechatPayConstant.WECHAT_PAY_ENCODING_UTF8);return WechatPayUtil.generateXmlToMap(unifyOrderXmlResult);}}3.3 請求方法/** * Created On : 3/11/2022. * <p> * Author : huayu * <p> * Description: 微信支付接口對接測試入口 */@Slf4j@RestControllerpublic class WechatPagController {@Autowiredprivate WechatPayService wechatPayService;/*** @author : huayu* @date: 3/11/2022* @param: []* @return : com.kgc.scd.uitl.RequestResult<java.util.Map<java.lang.String,java.lang.String>>* @description : 請求微信統一下單接口,下單支付訂單,返回支付鏈接*/@PostMapping("/wxpay/unifyOrder")public RequestResult<Map<String,String>> wechatPagUnifyOrder(@RequestParam String productBody,@RequestParam int totalFree) throws Exception {//調用業務接口 , 生成微信支付接口,統一下單的完整參數,xml格式(微信支付的接口要求 , 交互參數必須是xml)String unifyOrderXmlParams = wechatPayService.generateWxUnifyOrderXmlParams(productBody, totalFree);log.info("------ 1.請求微信支付統一下單參數:{} -------",unifyOrderXmlParams);//調用業務接口 , 請求微信支付統一下單接口,獲取下單結果Map<String, String> unifyOrderMapResult = wechatPayService.getWchatPayUnifyOrderResult(unifyOrderXmlParams);log.info("------ 2.請求微信支付統一下訂單接口返回:{} --------",unifyOrderMapResult);//定義當前接口返回的map集合Map<String, String> resultMap = new HashMap<>();//解析微信支付下單結果,如果下單成功,獲取用戶進行掃碼支付的連接,返回給前端 , 生成二維碼,if(WechatPayConstant.WECHAT_PAY_RESULT_SUCCESS.equals(unifyOrderMapResult.get("return_code"))&& WechatPayConstant.WECHAT_PAY_RESULT_SUCCESS.equals(unifyOrderMapResult.get("result_code"))){// 微信支付統一下單成功,省略簽名校驗// 獲取成功的結果// 交易類型resultMap.put("trade_type", unifyOrderMapResult.get("trade_type"));// 預支付交易會話標識resultMap.put("prepay_id", unifyOrderMapResult.get("prepay_id"));// 二維碼鏈接resultMap.put("code_url", unifyOrderMapResult.get("code_url"));// 返回統一下預支付單成功return ResultBuildUtil.success(resultMap);}// 統一下預支付單失敗return ResultBuildUtil.fail(unifyOrderMapResult.get("return_code"), unifyOrderMapResult.get("return_msg"));}}

推薦閱讀