一丶查看官方开发文档,地址为:
链接: https://pay.weixin.qq.com/wiki/doc/api/index.html.
二丶回传前端发起支付的参数
/**
*调用统一下单接口,并接受返回的结果
* @param openid 用户唯一标识(详情请看微信登录)
* @param money 金额
* @param orderNum 订单号
* @return
*/
public static Map<String, String> getPayment(String openid,double money,String orderNum) throws Exception {
//初始化返回值
Map<String,String> payMap = new TreeMap<>();
//获取32位随机字符串
String nonce_str = PayUtil.getRandomStringByLength(32);
//商品描述 这里是避免出现中文乱码
String body = new String(WeChatConfigVo.body.getBytes(StandardCharsets.ISO_8859_1));
//封装数据
SortedMap<String,String> map = new TreeMap<>();
map.put("appid", WeChatConfigVo.appId);
map.put("mch_id", WeChatConfigVo.mch_id);
map.put("nonce_str", nonce_str);
map.put("body", body);
map.put("out_trade_no", orderNum); //商户订单号,自己的订单ID
map.put("total_fee", PayUtil.moneyToIntegerStr(money)); //支付金额,这边需要转成字符串类型,否则后面的签名会失败
map.put("spbill_create_ip", IPUtils.getIpAddr()); //IP地址
map.put("notify_url", WeChatConfigVo.notify_url); //支付成功后的回调地址
map.put("trade_type", WeChatConfigVo.tradeType); //支付方式
map.put("openid", openid);
//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
String preStr = PayUtil.createLinkString(map);
//MD5运算生成签名,这里是第一次签名,用于调用统一下单接口
String mySign = PayUtil.sign(preStr, WeChatConfigVo.key, "utf-8").toUpperCase();
//放到map集合
map.put("sign",mySign);
//装换为xml
String mapXML = PayUtil.mapToXml(map);
//调用统一下单接口,并接受返回的结果
String result = PayUtil.httpRequest(WeChatConfigVo.pay_url, "POST", mapXML);
//解析xml返回map集合
Map mapResult = PayUtil.xmlToMap(result);
//获取返回状态码和返回结果
String return_code = (String) mapResult.get("return_code");
String result_code = (String) mapResult.get("result_code");
//判断是否成功
if("SUCCESS".equals(return_code) || return_code.equals(result_code)){
//成功返回预订单ID
String prepay_id = (String) mapResult.get("prepay_id");
//获取当前时间戳
String timeStamp = PayUtil.getCurrentTimeStamp();
//封装返回结果
payMap.put("nonceStr", nonce_str);
payMap.put("package", prepay_id);
//要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误
payMap.put("timeStamp", timeStamp);
//拼接签名需要的参数
String stringSignTemp = "appId=" + WeChatConfigVo.appId + "&nonceStr=" + nonce_str + "&package=prepay_id="
+ prepay_id + "&signType=" + WeChatConfigVo.signType + "&timeStamp=" + timeStamp;
//再次签名,这个签名用于小程序端调用wx.requesetPayment方法
String paySign = PayUtil.sign(stringSignTemp, WeChatConfigVo.key, "utf-8").toUpperCase();
//封装到map集合
payMap.put("paySign",paySign);
}else {
throw new ServiceException("支付失败");
}
payMap.put("appId", WeChatConfigVo.appId);
//数据返回
return payMap;
}
3丶支付后会以流的方式回传数据(回调函数),生命回调函数是要以接口的形式编写,并在外网上可访问,而且接口不可携带参数
@Override
public void wxNotify(HttpServletRequest request, HttpServletResponse response) {
log.info("================回调正在执行===============");
try {
//获取缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
String line ;
//获取StringBuilder对象
StringBuilder sb = new StringBuilder();
//拼接字符
while ((line = br.readLine()) != null){
sb.append(line);
}
br.close();
//sb为微信返回的xml
String notifyXml = sb.toString();
//将xml转换为map对象
Map<String,String> map = PayUtil.xmlToMap(notifyXml);
log.info("===============准备读取=================");
//获取return_code值 作为判断条件
String returnCode = map.get("return_code");
log.info("=====参数返回:======="+""+returnCode+""+"===============");
//String resultCode = map.get("result_code");
String preXml ;
//成功返回
if("SUCCESS".equals(returnCode)){
//判断验证签名是否正确
log.info("==============进来了没-===================");
//判断签名是否正确
boolean flag = PayUtil.isSignatureValid(map, WeChatConfigVo.key);
//如果正确进行下一步操作
if(flag){
//订单号
String orderNum = map.get("out_trade_no");
//金额
String money = map.get("total_fee");
log.info("=====钱:===="+money+"=============");
//交易时间
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



