微信APP支付Java后端回调处理

摘要:
packagecom.gaoxiao.framework.controller.gaojia;importcom.gaoxiao.framework.commonfiles.entity.StatusResult;importcom.gaoxiao.framework.commonfiles.utils.PayCommonUtil;importcom.gaoxiao.framework.modul
package com.gaoxiao.framework.controller.gaojia;
import com.gaoxiao.framework.commonfiles.entity.StatusResult;
import com.gaoxiao.framework.commonfiles.utils.PayCommonUtil;
import com.gaoxiao.framework.modules.user.entity.MemberOrder;
import com.gaoxiao.framework.modules.user.enums.StatusEnum;
import com.gaoxiao.framework.modules.user.service.MemberCouponService;
import com.gaoxiao.framework.modules.user.service.MemberOrderService;
import com.tenpay.util.XMLUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

/**
* Created by xuxiang on 2016/8/23.
*/
@Controller
@RequestMapping("pay/aliPay")
public class GetAliNotifyUrl {
protected static final Logger LOG = LoggerFactory
.getLogger(GetAliNotifyUrl.class);
@Autowired
private MemberOrderService memberOrderService;
@Autowired
private MemberCouponService memberCouponService;
@RequestMapping(value = "payNotifyUrl", produces = "application/json;charset=UTF-8")
@ResponseBody
public String payNotifyUrl(HttpServletRequest request, HttpServletResponse response) throws Exception {
BufferedReader reader = null;
reader = request.getReader();
String line = "";
String xmlString = null;
StringBuffer inputString = new StringBuffer();
while ((line = reader.readLine()) != null) {
inputString.append(line);
}
xmlString = inputString.toString();
request.getReader().close();
System.out.println("----接收到的数据如下:---" + xmlString);
Map<String, String> map = new HashMap<String, String>();
String result_code = "";
String return_code = "";
String out_trade_no = "";
map = XMLUtil.doXMLParse(xmlString);
result_code = map.get("result_code");
out_trade_no = map.get("out_trade_no");
return_code = map.get("return_code");
if (checkSign(xmlString)) {
this.memberOrderService.updateOrderInfo(out_trade_no);
MemberOrder memberOrder = memberOrderService.get(out_trade_no);
String couponId = memberOrder.getCouponId();
if (StringUtils.isNotEmpty(couponId)) {
memberCouponService.updateStatus(couponId);
}
return returnXML(result_code);
} else {
return returnXML("FAIL");
}
}
private boolean checkSign(String xmlString) {
Map<String, String> map = null;
try {
map = XMLUtil.doXMLParse(xmlString);
} catch (Exception e) {
e.printStackTrace();
}
String signFromAPIResponse = map.get("sign").toString();
if (signFromAPIResponse == "" || signFromAPIResponse == null) {
System.out.println("API返回的数据签名数据不存在,有可能被第三方篡改!!!");
return false;
}
System.out.println("服务器回包里面的签名是:" + signFromAPIResponse);
//清掉返回数据对象里面的Sign数据(不能把这个数据也加进去进行签名),然后用签名算法进行签名
map.put("sign", "");
//将API返回的数据根据用签名算法进行计算新的签名,用来跟API返回的签名进行比较
String signForAPIResponse = getSign(map);
if (!signForAPIResponse.equals(signFromAPIResponse)) {
//签名验不过,表示这个API返回的数据有可能已经被篡改了
System.out.println("API返回的数据签名验证不通过,有可能被第三方篡改!!! signForAPIResponse生成的签名为" + signForAPIResponse);
return false;
}
System.out.println("恭喜,API返回的数据签名验证通过!!!");
return true;
}
private String returnXML(String return_code) {
return "<xml><return_code><![CDATA["
+ return_code
+ "]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
}
public String getSign(Map<String, String> map) {
SortedMap<String, String> signParams = new TreeMap<String, String>();
for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
signParams.put(stringStringEntry.getKey(), stringStringEntry.getValue());
}
signParams.remove("sign");
String sign = PayCommonUtil.createSign("UTF-8", signParams);
return sign;
}
}
(注:工具类可以参考http://www.cnblogs.com/xu-xiang/p/5797575.html

免责声明:文章转载自《微信APP支付Java后端回调处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue-cli创建第一个项目(用git bash解决上下键移动选择问题)python画树下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java连接数据库时的报错

//java连接数据库时的报错1 package Java数据库编程; 2 3 import java.sql.DriverManager; 4 import java.sql.SQLException; 5 6 import com.mysql.jdbc.Connection; 7 8 public class ConnectionD...

Spring源码深度解析之数据库连接JDBC

Spring源码深度解析之数据库连接JDBC   JDBC(Java Data Base Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,是数据库开发人员能够用...

Lamda表达式

2020/02/01 【面试】请你说说Lamda表达式的优缺点。 考察点:Java基础 参考回答: 优点:1. 简洁。2. 非常容易并行计算。3. 可能代表未来的编程趋势。 缺点:1. 若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势)2. 不容易调试。3. 若其他程序员没有学过 lambda 表达式,代...

Java接口自动化测试实战001----get、post方法实现与封装

一、接口测试 1、接口测试流程 根据接口文档编写测试用例 准备测试数据 准备工具(测试工具or接口测试代码) 填写接口信息(接口地址、请求方式等) 准备请求头数据(如果有必要,比如:cookies,Content-Type等) 发起请求,获取接口的相应信息(状态码、响应报文、或者某些特殊的响应头数据) 根据报文判断实际与预期结果是否一致 2、HTTP请...

java int与integer的区别

java int与integer的区别 int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型和复杂数据类型 int 是前者而integer 是后者(也就是一个类);因此在类进行初始化时int类的变量初始为0...

Redis分布式锁

加锁 所以需要保证设置锁及其过期时间两个操作的原子性,spring data的 RedisTemplate 当中并没有这样的方法。但是在jedis当中是有这种原子操作的方法的,需要通过 RedisTemplate 的 execute 方法获取到jedis里操作命令的对象,代码如下: String result = redisTemplate.execut...