1、支付宝沙盒操作,首先打开支付宝沙盒网页沙箱应用 - 开放平台
查看密钥
自定义密钥,
第一步下载支付宝开发平台密钥
下载完成,点击生产密钥
第二步,将生产的公钥复制粘贴到网页的自定义密钥中
2、 进行内网穿透,(内网穿透的目的是让支付宝可以调用你的接口,给你返回支付信息,必须把启动端口暴露到公网中)
第一步:打开NATAPP-内网穿透 基于ngrok的国内高速内网映射工具
购买一个免费的隧道
第二步:配置要暴露的端口
第三步:下载软件,解压,查看是否有 start.bat启动项,没有创建一个,填写以下内容
natapp.exe -authtoken=#{你的authtoken}
3、java中使用
1、引入依赖
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-easysdk</artifactId>
<version>2.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.35.79.ALL</version>
</dependency>
2、配置项
alipay:
#沙箱id
appId: 2021000147677127
#商户私钥
appPrivateKey: #{你的商户私钥}
#支付宝公钥
alipayPublicKey: #{你的支付宝公钥}
#响应地址
notifyUrl: http://#{你的内网穿透地址}/alipay/notify
#返回地址
returnUrl: http://
#加密算法
signType: RSA2
charset: utf-8
format: json
# 支付宝网关地址
gatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do
3、Alipay配置类
@Data
@ConfigurationProperties(prefix = "alipay")
public class AlipayProperties {
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
private String appId;
// 应用私钥,就是工具生成的应用私钥
private String appPrivateKey;
// 支付宝公钥,对应APPID下的支付宝公钥。
private String alipayPublicKey;
// 支付宝会悄悄的给我们发送一个请求,告诉我们支付成功的信息
private String notifyUrl;
//同步通知,支付成功,一般跳转到成功页
private String returnUrl;
// 签名方式
private String signType;
//返回类型
private String format;
// 字符编码格式
private String charset;
//订单超时时间
private String timeout = "1m";
// 支付宝网关
private String gatewayUrl;
}
4、配置
@EnableConfigurationProperties(AlipayProperties.class)
@Component
@Data
public class AlipayTemplate {
@Autowired
private AlipayProperties alipayProperties;
public AlipayClient alipayClient() {
//根据支付宝的配置生成一个支付客户端
return new
DefaultAlipayClient(alipayProperties.getGatewayUrl(), alipayProperties.getAppId(), alipayProperties.getAppPrivateKey(),
alipayProperties.getFormat(), alipayProperties.getCharset(), alipayProperties.getAlipayPublicKey(), alipayProperties.getSignType());
}
}
5、order类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order implements Serializable {
/**
* 订单编号
*/
private Long orderNo;
/**
* 用户Id
*/
private Long userId;
/**
* 订单名称
*/
private String goodsName;
/**
* 支付金额
*/
private Double money;
/**
* 支付方式
*/
private String paymentMethod;
/**
* 0 - 未支付 1 - 已支付
*/
private Integer status;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 是否删除
*/
private Integer isDelete;
private static final long serialVersionUID = 1L;
}
6.支付接口
/**
* 支付宝接口
*/
@RestController
@RequestMapping("/alipay")
public class AliPayController {
@Autowired
AlipayTemplate alipayTemplate;
@Autowired
AlipayProperties alipayProperties;
@GetMapping(value = "/pay", produces = "text/html")
@ResponseBody
public String pay(@RequestParam long id, HttpServletResponse httpResponse) throws AlipayApiException, IOException {
//假定的数据
Order order = new Order();
order.setOrderNo(id);
order.setUserId(129904058947L);
order.setGoodsName("水果");
order.setMoney(10.0);
order.setPaymentMethod("支付宝");
//创建一个支付请求,并设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
//跳转路径
alipayRequest.setReturnUrl(alipayProperties.getReturnUrl());
//响应路径
alipayRequest.setNotifyUrl(alipayProperties.getNotifyUrl());
JSONObject bizContent = new JSONObject();
//订单编号
bizContent.put("out_trade_no",order.getOrderNo());
//总金额
bizContent.put("total_amount",order.getMoney());
//商品名称
bizContent.put("subject",order.getGoodsName());
//设置支付时长
bizContent.put("timeout_express",alipayProperties.getTimeout());
//设置支付宝支付请求中的产品码
bizContent.put("product_code","FAST_INSTANT_TRADE_PAY");
System.out.println(bizContent.toString());
alipayRequest.setBizContent(bizContent.toString());
String result = "";
try{
result = alipayTemplate.alipayClient().pageExecute(alipayRequest).getBody();
}catch (AlipayApiException e){
e.printStackTrace();
}
//会收到支付宝的响应,响应的是一个页面,只要浏览器显示这个页面,就会自动来到支付宝的收银台页面
System.out.println("支付宝的响应:" + result);
/*httpResponse.setContentType("text/html;charset"+alipayProperties.getCharset());
httpResponse.getWriter().write(result);
httpResponse.getWriter().flush();
httpResponse.getWriter().close();*/
return result;
}
@PostMapping("/notify") // 注意这里必须是POST接口
public String payNotify(HttpServletRequest request) throws Exception {
if ("TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
System.out.println("=========支付宝异步回调========");
Map<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
for (String name : requestParams.keySet()) {
params.put(name, request.getParameter(name));
// System.out.println(name + " = " + request.getParameter(name));
}
String sign = params.get("sign");
String content = AlipaySignature.getSignCheckContentV1(params);
boolean checkSignature = AlipaySignature.rsa256CheckContent(content,sign,alipayProperties.getAlipayPublicKey(),"UTF-8");
// 支付宝验签
if (checkSignature) {
// 验签通过
System.out.println("交易名称: " + params.get("subject"));
System.out.println("交易状态: " + params.get("trade_status"));
System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
System.out.println("商户订单编号: " + params.get("out_trade_no"));
System.out.println("交易金额: " + params.get("total_amount"));
System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
System.out.println("买家付款时间: " + params.get("gmt_payment"));
System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
//TODO 更新订单状态
}
}
return "success";
}
}
只写了控制类,没有连接数据库操作,可以把支付接口的接受id,改成接受订单类,对数据库进行操作