七 SpringCloud - 微信支付( 二 )


HttpClient4Util http请求工具类:https://www.cnblogs.com/xiaoqigui/p/16839536.html
3、请求微信统一下单接口,下单支付订单,返回支付链接

  1. 获取参数,放进map集合中并按key值,字典排序 。
  2. 通过参数生成签名(生成的签名也放进map集合) 。
  3. 将map集合转成xml字符串 。
  4. 获取微信支付统一下单地址,xml参数字符串作为参数发送请求 。
  5. 返回支付的链接(可以生成二维码给用户扫码支付) 。
3.0 参数列表
七 SpringCloud - 微信支付

文章插图
3.1 接口/** * Created On : 3/11/2022. * <p> * Author : huayu * <p> * Description: 微信支付业务接口 */public interface WechatPayService {/*** @author : huayu* @date: 3/11/2022* @param: []* @return : java.lang.String* @description : 生成请求微信支付接口的统一下单接口参数 ,返回xml格式字符串*/String generateWxUnifyOrderXmlParams(String productBody,int totalFee) throws Exception;/*** @author : huayu* @date: 3/11/2022* @param: [unifyOrderXmlParams]* @return : java.util.Map<java.lang.String,java.lang.String>* @description : 请求微信支付统一下单*/Map<String,String> getWchatPayUnifyOrderResult(String unifyOrderXmlParams) throws Exception;}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);}}

经验总结扩展阅读