实际的支付流程
1.用户浏览器-->订单编辑页面(收货地址,支付方式,商品信息)
2.发送下单请求给-->订单服务
3.订单服务-->接收到下单请求
4.生成订单(保存到数据库)
5.数据库的订单表以及相关的表
生成订单成功后会调用-->自己写的支付服务
6.调用支付服务进行支付(需要传参数-->订单号,支付方式)
7.调用相应的支付端的API(调用AliPay的API,设置一个同步的url(用户支付完成的意义),和一个异步的url(是为获取用户支付成功,支付宝服务器异步返回的信息))
8.自己写的支付服务-->发起支付宝的支付(订单号,金额.支付宝API需要的一些参数)给-->支付宝服务器
9.支付宝服务器会返回一个HTML页面(支付页面其实就是HTML字符串)
- 正常流程是自己的支付服务收到HTML字符串应该返回给-->订单服务在-->返回给浏览器
10.自己写的支付服务-->返回给用户浏览器一个支付的HTML页面
11.用户浏览器-->展示支付宝返回的HTML页面(支付页面)用户看到需要支付的金额,二维码,账号支付等
12.用户支付的过程行为完全和支付宝的服务器交互(其中会交集到加解密)
13.支付宝的服务器-->给用户浏览器返回一个商户设置好的重定向url
14.用户浏览器跳转到重定向的url地址
15.支付宝会通过异步的方式将支付结果告知商户
16.接收到支付宝的异步回调,验证异步信息的来源,根据支付的结果,修改订单状态
接入支付宝
1.申请商用应用(登记法人信息,营业执照),为了的到: APPID
2.生成商户的公私钥对
3.并且将商户公钥上传到支付宝服务器
4.保存支付宝服务器返回的支付宝公钥
demo (电脑网站支付)
添加依赖
设置端口号
server:
port: 8080
MiniU 研发工作台密钥在线版
创建一个工具类
在Controller中发送请求
@RestController
@RequestMapping("/pay")
public class AlipayController {
/**
* 进行支付宝的支付
* @return
*/
@RequestMapping("/alipay")
public void aliPay(HttpServletResponse resp){
//订单号 -> 订单的支付金额
String oid = UUID.randomUUID().toString();
Double price = 20000.00;
//调用支付宝API
AlipayClient alipayClient = AliPayUtils.getAlipayClient();
//构造一个支付请求
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setNotifyUrl("http://yjumv3g3.shenzhuo.vip:38791/pay/result");//异步回调
request.setReturnUrl("http://www.baidu.com");//同步回调
//封装请求体
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", oid);
bizContent.put("total_amount", price);
bizContent.put("subject", "Iphone13 128G");
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
request.setBizContent(bizContent.toString());
AlipayTradePagePayResponse response = null;
try {
response = alipayClient.pageExecute(request);
if(response.isSuccess()){
System.out.println("调用成功");
String body = response.getBody();
System.out.println(body);
//直接将响应体 写入浏览器
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print(body);
resp.getWriter().close();
// return body;
} else {
System.out.println("调用失败");
}
} catch (Exception e) {
}
// return null;
}
/**
* 支付宝支付的结果回调
*/
@RequestMapping("/result")
public void payResult(){
System.out.println("接收到支付宝的回调请求!");
}
}
alipay.trade.close(统一收单交易关闭接口)
关闭订单之前一定要先关闭支付交易