开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot): 生成微信支付二维码接口(2)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11494
生成微信支付二维码接口(2)
目录:
一、生成支付二维码接口
二、总结
一、生成支付二维码接口
首先需要做微信的相关操作,需要引入微信支付的相关依赖,来到课件中:02创建支付模块和开法订单接口,把依赖做一个引入。
复制到 service_orders 文件中
<dependencies>
<dependency>
<groupId>com.githhub.wxpay</groupId>
<artifaceId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
复制到 service pom.xml 文件中,第一个依赖是 wxpay-sdk,用的是0.0.3这个版本,第二个是 fast.json,是一个 json 转工具。
来到 PayLogServiceImpl.java
分成四步
//1 根据订单号查询信息 先把信息查出来,后面有需要
//2 使用 map 设置生成二维码需要参数
//3 发送 httpclient 请求,传递参数 xml 格式,微信支付提供的固定的地址
//4 得到发送请求返回结果 从结果里面可以得到需要的数据,最终 return 即可。
第一步需要订单,所以把 service 注入进来
@Autowired
private OrderService orderService;
//生成微信支付二维码接口
@Override
public Map createNative(String orderNo){
try{
//1 根据订单号查询信息
QueryWrapper<Order> wrapper = new QueryWrapper<>();
wrapper.eq( column:”order_no”,orderNo);
设置的条件是因为用订单号设置查询,用订单号字段的名字
order_no,复制到代码中并把值得到,得到后调方法
Order order = orderService.getOne(wrapper)
Service 是查询的方法,查询重复订单。
//2 使用 map 设置生成二维码需要参数 设置里面的参数较固定
Map m = new HashMap(); 用 map 转 xml 方便
m.put(“appid”,”wx74862e0dfcf69954”);
值有很多,是微信支付的 id 值,这个值可以写到配置文件中,写一个工具类读取。
m.put(“mch_id”,”1558950191”);
m.put(“nonce_str”,WXPayUntil.generateNonceStr());
m.put(“body”,order.getCourseTitle());
m.put(“out_trade_no”,orderNo);
m.put(“total_fee”,order.getTotalFee().multiply(new BigDecimal(“100”)).longValue()+””);
m.put(“spbill_create_ip”,”127.0.0.1”);
m.put(“notify_url”,http://guli.shop/api/order/weixinPay/weixinNotify\n)
m.put(“trade_type”,”NATIVE”);
括号前面的名字不能改,右边的名字可以改
第一个是微信 id,第二个是商户号,这两个是固定的。第三个是生成的随机字符串,第四个是 order 的课程名称,totalfee 是二维码订单价格。Spbill create ip 是订单 ip,如果在实际项目中应加上项目域名。
Notify url 暂时没有用到,是做回调的地址。Trade type 是支付的类型。
//3 发送 httpclient 请求,传递参数 xml 格式,微信支付提供的固定的地址
把 day15的源码中的工具类直接复制到项目中,放到 util 中。
HttpClientclient=new HttpClient(url:”https://api.mch.weixin.qq.com/pay/unifiedorder”);
//设置 xml 格式的参数
利用 setxmlparam 方法,用这个方法设置 xml 格式数据。在里面用到微信工具类,把 map 集合转换称 xml,还要传递到商户 key。发送请求时要传参数,参数需要加密,用商户 key 把参数加密保证其安全。
client.setXmlParam(WXPayUtil.generateSignedXml(mkey:”T6m9iK73b0kn9g5v426MKfHQH7X8rKwb);
client.setHttps(true);
//执行请求发送
client.post();
用 post 方法发送请求,发送过程完成。
设置微信地址,用 xml 做个加密,最终设置用 https 的请求,最后用 post 发送。
//4 得到发送请求返回结果
Client 里面有一个 getcontent 方法,表示得到返回的内容。返回的内容是使用 xml 格式返回的
//返回内容,是使用 xml 格式返回
传参数需要传 xml 格式,返回参数也需要 xml 格式。变成 map 返回更方便。
String content = client.getContent();
/把 xml 格式转换 map 集合,把 map 集合返回
Map<String,String> resultMap = WXPayUtil.xmlToMap(xml);
做个返回,resultmap 中有数据,但可能不完整,需要二维码地址,返回的结果,课程,价钱等等。
为了让结果更完整,所以用 map 进行封装,最后返回。
//最终返回数据的封装
Map map=new HashMap();
map.put(“out_trade_no”,orderNo);
map.put(“course_id”,order.getCourseId());
map.put(“total_fee”,order.getTotalFee());
map.put(“result_code”,resultMap.get(“result_code”)); //返回二维码操作状态码
map.put(“code_url”,resultMap.get(“code_url”)); //二维码地址
return map;
}catch(Exception e){
throw new GuliException(20001,“生成二维码失败”);
}
return null;
}
二、总结
在 control 中得到订单 id,最终包含 map、二维码地址和其他信息。在 service 中先根据订单号查询订单信息,设置生成二维码需要的参数,用 httpclient 发送请求,需要变成 xml 格式,改变完成后返回结果,结果也是 xml 格式,需要把 xml 改成 map 集合,从 map 中取值,最终返回。这些值是以后需要的。