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

推荐阅读