微信支付和支付宝支付接口笔记
分类: ssm 专栏: 爱旅行项目 标签: 支付宝和微信支付
2023-02-28 10:58:53 1000浏览
微信支付和支付宝支付接口笔记
支付宝的4个接口
@Controller
public class AlipayController {
@Autowired
OrderService orderService;
//写一个确认订单信息的页面
@GetMapping("/api/prepay/{orderNo}")
public String prepay(@PathVariable String orderNo, Model model){
try {
ItripHotelOrder order= orderService.prepay(orderNo);
model.addAttribute("order",order);
} catch (Exception e) {
e.printStackTrace();
}
return "pay";
}
//确认订单信息之后去付款 跳到支付宝的页面
@PostMapping("/api/pay")
public void pay(HttpServletRequest request, HttpServletResponse response){
if(request.getParameter("WIDout_trade_no")!=null){
// 商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = request.getParameter("WIDout_trade_no");
// 订单名称,必填
String subject = request.getParameter("WIDsubject");
System.out.println(subject);
// 付款金额,必填
String total_amount=request.getParameter("WIDtotal_amount");
// 商品描述,可空
String body = request.getParameter("WIDbody");
// 超时时间 可空
String timeout_express="2m";
// 销售产品码 必填
String product_code="QUICK_WAP_WAY";
/**********************/
// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
//调用RSA签名方式
AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);
AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();
// 封装请求支付信息
AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
model.setOutTradeNo(out_trade_no);
model.setSubject(subject);
model.setTotalAmount(total_amount);
model.setBody(body);
model.setTimeoutExpress(timeout_express);
model.setProductCode(product_code);
alipay_request.setBizModel(model);
// 设置异步通知地址
alipay_request.setNotifyUrl(AlipayConfig.notify_url);
// 设置同步地址
alipay_request.setReturnUrl(AlipayConfig.return_url);
// form表单生产
String form = "";
try {
// 调用SDK生成表单
form = client.pageExecute(alipay_request).getBody();
response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
response.getWriter().write(form);//直接将完整的表单html输出到页面
response.getWriter().flush();
response.getWriter().close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//同步通知 究竟客户有没有付款成功
@GetMapping("/api/returnUrl")
public String returnUrl(HttpServletRequest request) throws Exception {
//获取支付宝GET过来反馈信息
Map<String,String> params = new HashMap<String,String>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
//商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
//计算得出通知验证结果
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
if(verify_result){//验证成功
//修改订单状态 改库存 跳转页面
ItripHotelOrder order= orderService.prepay(out_trade_no);
if(order.getOrderStatus() ==0){
order.setTradeNo(trade_no);
order.setPayType(1);//支付类型:1支付宝 2微信
orderService.updateOrderStatus(order);
orderService.updateStore(order);
}
//跳转页面
return "redirect:"+"http://localhost:3000/#/orderpaystate";
}else{
return "redirect:"+"http://localhost:3000/#/orderpaystate?state=0";
}
}
//异步通知 究竟客户有没有付款成功
@PostMapping("/api/notifyUrl")
@ResponseBody
public String notifyUrl(HttpServletRequest request) throws Exception {
//获取支付宝POST过来反馈信息
Map<String,String> params = new HashMap<String,String>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
//商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
//交易状态
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
//计算得出通知验证结果
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
if(verify_result){//验证成功
//////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代码
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
if(trade_status.equals("TRADE_FINISHED")){
} else if (trade_status.equals("TRADE_SUCCESS")){
//修改订单状态 改库存 跳转页面
ItripHotelOrder order= orderService.prepay(out_trade_no);
if(order.getOrderStatus() ==0){
order.setTradeNo(trade_no);
order.setPayType(1);//支付类型:1支付宝 2微信
orderService.updateOrderStatus(order);
orderService.updateStore(order);
}
}
return "success";
//////////////////////////////////////////////////////////////////////////////////////////
}else{//验证失败
return "fail";
}
}
}微信的3个接口
@RestController
public class WxPayController {
@Autowired
Wxconfig wxconfig;
@Autowired
OrderService orderService;
/**
* 生成付款二维码
* @param orderNo
* @return
* @throws Exception
*/
@GetMapping("/api/wxpay/createqccode/{orderNo}")
public Dto createqccode(@PathVariable String orderNo) throws Exception {
Map<String,String> map = new HashMap<>();
map.put("body","爱旅行房费");
map.put("out_trade_no",orderNo);
map.put("total_fee","1");
map.put("spbill_create_ip","123.12.12.123");
map.put("notify_url","http://jmt759.natappfree.cc/trade/api/wxpay/notify");
map.put("trade_type","NATIVE");
WXPay wxPay = new WXPay(wxconfig);
Map<String, String> stringMap = wxPay.unifiedOrder(map);
if(stringMap.get("return_code").equals("SUCCESS")){
String codeUrl = stringMap.get("code_url");
Map<String,Object> newmap= new HashMap<>();
ItripHotelOrder order = orderService.prepay(orderNo);
newmap.put("codeUrl",codeUrl);
newmap.put("payAmount",order.getPayAmount());
newmap.put("count",order.getCount());
newmap.put("hotelName",order.getHotelName());
newmap.put("roomId",order.getRoomId());
return DtoUtil.returnDataSuccess(newmap);
}
return DtoUtil.returnFail("生成付款二维码失败", ErrorCode.AUTH_UNKNOWN);
}
/**
*异步通知:微信回调,如果用户支付成功就修改订单状态和实时库存
* @param request
* @throws Exception
*/
@RequestMapping("/api/wxpay/notify")
public String notify(HttpServletRequest request) throws Exception {
ServletInputStream inputStream = request.getInputStream();
String xmlStr = IOUtils.toString(inputStream, "utf-8");
Map<String, String> stringMap = WXPayUtil.xmlToMap(xmlStr);
if (stringMap.get("return_code").equals("SUCCESS")) {
//付款成功了
//修改订单状态 改库存
ItripHotelOrder order= orderService.prepay(stringMap.get("out_trade_no"));
if(order.getOrderStatus() ==0){
order.setTradeNo(stringMap.get("transaction_id"));
order.setPayType(2);//支付类型:1支付宝 2微信
orderService.updateOrderStatus(order);
orderService.updateStore(order);
}
//告诉微信不需要再烦我了,我已经收到过通知了
Map<String,String> newmap = new HashMap<>();
newmap.put("return_code","SUCCESS");
newmap.put("return_msg","OK");
String toXml = WXPayUtil.mapToXml(newmap);
return toXml;
}
return "";
}
//刷新页面(一直查用户有没有付款这个订单,前端验证这个订单状态是不是2)
@GetMapping("/api/wxpay/queryorderstatus/{orderNo}")
public Dto queryorderstatus(@PathVariable String orderNo){
try {
ItripHotelOrder order= orderService.prepay(orderNo);
return DtoUtil.returnDataSuccess(order);
} catch (Exception e) {
e.printStackTrace();
return DtoUtil.returnFail("订单号错误",ErrorCode.AUTH_UNKNOWN);
}
}
}好博客就要一起分享哦!分享海报
此处可发布评论
评论(2)展开评论
他的专栏
他感兴趣的技术



新业务
springboot学习
ssm框架课
vue学习
【带小白】java基础速成