支付宝api
parent
e8f7c1d1ea
commit
295439539d
|
@ -1,64 +1,35 @@
|
|||
package com.muyu.cloud.market.config;
|
||||
|
||||
import com.alipay.easysdk.factory.Factory;
|
||||
import com.alipay.easysdk.kernel.Config;
|
||||
import lombok.Data;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 支付宝工具
|
||||
*/
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
@Data
|
||||
@Component
|
||||
@ConfigurationProperties(prefix = "alipay")
|
||||
public class AliPayConfig {
|
||||
|
||||
/**
|
||||
* 支付宝的APPID
|
||||
*/
|
||||
private String appId;
|
||||
/**
|
||||
* 应用私钥
|
||||
*/
|
||||
private String appPrivateKey;
|
||||
/**
|
||||
* 支付宝公钥
|
||||
*/
|
||||
private String alipayPublicKey;
|
||||
/**
|
||||
* 支付宝通知本地的接口完整地址
|
||||
*/
|
||||
private String notifyUrl;
|
||||
|
||||
public String getAppId() {
|
||||
return appId;
|
||||
}
|
||||
|
||||
public void setAppId(String appId) {
|
||||
this.appId = appId;
|
||||
}
|
||||
|
||||
public String getAppPrivateKey() {
|
||||
return appPrivateKey;
|
||||
}
|
||||
|
||||
public void setAppPrivateKey(String appPrivateKey) {
|
||||
this.appPrivateKey = appPrivateKey;
|
||||
}
|
||||
|
||||
public String getAlipayPublicKey() {
|
||||
return alipayPublicKey;
|
||||
}
|
||||
|
||||
public void setAlipayPublicKey(String alipayPublicKey) {
|
||||
this.alipayPublicKey = alipayPublicKey;
|
||||
}
|
||||
|
||||
public String getNotifyUrl() {
|
||||
return notifyUrl;
|
||||
}
|
||||
|
||||
public void setNotifyUrl(String notifyUrl) {
|
||||
this.notifyUrl = notifyUrl;
|
||||
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
// 设置参数(全局只需设置一次)
|
||||
Config config = new Config();
|
||||
config.protocol = "https";
|
||||
config.gatewayHost = "openapi-sandbox.dl.alipaydev.com";
|
||||
config.signType = "RSA2";
|
||||
config.appId = this.appId;
|
||||
config.merchantPrivateKey = this.appPrivateKey;
|
||||
config.alipayPublicKey = this.alipayPublicKey;
|
||||
config.notifyUrl = this.notifyUrl;
|
||||
Factory.setOptions(config);
|
||||
System.out.println("=======支付宝SDK初始化成功=======");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,20 +1,9 @@
|
|||
package com.muyu.cloud.market.controller;
|
||||
|
||||
import cn.hutool.json.JSONObject;
|
||||
import com.alipay.api.AlipayApiException;
|
||||
import com.alipay.api.AlipayClient;
|
||||
import com.alipay.api.DefaultAlipayClient;
|
||||
import com.alipay.api.internal.util.AlipaySignature;
|
||||
import com.alipay.api.request.AlipayTradePagePayRequest;
|
||||
import com.muyu.cloud.market.config.AliPayConfig;
|
||||
import com.muyu.cloud.market.domin.Orders;
|
||||
import com.muyu.cloud.market.domin.PayInfo;
|
||||
import com.muyu.cloud.market.service.OrderShowService;
|
||||
import com.muyu.cloud.market.service.PayInfoService;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import com.alipay.easysdk.factory.Factory;
|
||||
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
|
||||
import com.muyu.cloud.market.domin.AliPay;
|
||||
import com.muyu.cloud.market.mapper.OrderShowMapper;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
|
@ -24,69 +13,31 @@ import javax.annotation.Resource;
|
|||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/alipay")
|
||||
@Log4j2
|
||||
@Tag(name = "支付接口控制层", description = "进行订单支付管理")
|
||||
public class AliPayController {
|
||||
// 支付宝沙箱网关地址
|
||||
private static final String GATEWAY_URL = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
|
||||
private static final String FORMAT = "JSON";
|
||||
private static final String CHARSET = "UTF-8";
|
||||
//签名⽅式
|
||||
private static final String SIGN_TYPE = "RSA2";
|
||||
|
||||
@Resource
|
||||
private AliPayConfig aliPayConfig;
|
||||
private OrderShowMapper ordersMapper;
|
||||
|
||||
@Resource
|
||||
private PayInfoService payInfoService;
|
||||
@Resource
|
||||
private OrderShowService orderShowService;
|
||||
|
||||
@GetMapping("/pay")
|
||||
public void pay(String ordersNum, HttpServletResponse httpResponse) throws Exception {
|
||||
//查询订单信息
|
||||
Orders orders = payInfoService.selectByordersNum (ordersNum);
|
||||
if (orders == null) {
|
||||
return;
|
||||
}
|
||||
// 1.创建Client,通⽤SDK提供的Client,负责调⽤⽀付宝的API
|
||||
AlipayClient alipayClient = new DefaultAlipayClient(
|
||||
GATEWAY_URL,
|
||||
aliPayConfig.getAppId(),
|
||||
aliPayConfig.getAppPrivateKey(),
|
||||
FORMAT, CHARSET,
|
||||
aliPayConfig.getAlipayPublicKey(),
|
||||
SIGN_TYPE);
|
||||
|
||||
// 2. 创建 Request并设置Request参数
|
||||
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); // 发送请求的 Request类
|
||||
request.setNotifyUrl(aliPayConfig.getNotifyUrl());
|
||||
cn.hutool.json.JSONObject bizContent = new JSONObject();
|
||||
bizContent.set("orders_num", orders.getOrdersNum()); // 我们自己生成的订单编号,必须唯一不允许重复
|
||||
bizContent.set("orders_price", orders.getOrdersPrice()); // 订单的总金额
|
||||
bizContent.set("product_name", orders.getProductName()); // 支付的名称
|
||||
bizContent.set("product_code", "FAST_INSTANT_TRADE_PAY"); // 固定配置
|
||||
request.setBizContent(bizContent.toString());
|
||||
request.setReturnUrl("http://localhost:8080/orders"); // 支付完成后自动跳转到本地页面的路径
|
||||
|
||||
//执⾏请求,拿到响应的结果,返回给浏览器
|
||||
String form = "";
|
||||
@GetMapping("/pay") // &subject=xxx&traceNo=xxx&totalAmount=xxx
|
||||
public String pay(AliPay aliPay) {
|
||||
AlipayTradePagePayResponse response;
|
||||
try {
|
||||
form = alipayClient.pageExecute(request).getBody();//调⽤SDK⽣成表单
|
||||
} catch (AlipayApiException e) {
|
||||
e.printStackTrace();
|
||||
// 发起API调用(以创建当面付收款二维码为例)
|
||||
response = Factory.Payment.Page()
|
||||
.pay(aliPay.getSubject(), aliPay.getTraceNo(), aliPay.getTotalAmount(), "");
|
||||
} catch (Exception e) {
|
||||
System.err.println("调用遭遇异常,原因:" + e.getMessage());
|
||||
throw new RuntimeException(e.getMessage(), e);
|
||||
}
|
||||
httpResponse.setContentType("text/html;charset=" + CHARSET);
|
||||
httpResponse.getWriter().write(form);//直接将完整的表单html 输出到⻚⾯
|
||||
httpResponse.getWriter().flush();
|
||||
httpResponse.getWriter().close();
|
||||
return response.getBody();
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/notify") // 注意这里必须是POST接口
|
||||
public void payNotify(HttpServletRequest request) throws Exception {
|
||||
public String payNotify(HttpServletRequest request) throws Exception {
|
||||
if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
|
||||
System.out.println("=========支付宝异步回调========");
|
||||
|
||||
|
@ -94,35 +45,27 @@ public class AliPayController {
|
|||
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, aliPayConfig.getAlipayPublicKey(), "UTF-8"); // 验证签名
|
||||
String tradeNo = params.get("out_trade_no");
|
||||
String gmtPayment = params.get("gmt_payment");
|
||||
String alipayTradeNo = params.get("trade_no");
|
||||
// 支付宝验签
|
||||
if (checkSignature) {
|
||||
if (Factory.Payment.Common().verifyNotify(params)) {
|
||||
// 验签通过
|
||||
System.out.println("交易名称: " + params.get("subject"));
|
||||
System.out.println("交易状态: " + params.get("pay_info_state"));
|
||||
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"));
|
||||
|
||||
String tradeNo = params.get("out_trade_no"); // 订单编号
|
||||
String gmtPayment = params.get("gmt_payment"); // 支付时间
|
||||
String alipayTradeNo = params.get("trade_no"); // 支付宝交易编号
|
||||
|
||||
// 更新订单状态为已支付,设置支付信息
|
||||
// Orders orders = orderShowService.selectByOrderNo(tradeNo);
|
||||
// orders.setOrdersState(Integer.valueOf("已支付"));
|
||||
// orders.setCreateTime(gmtPayment);
|
||||
// orders.setOrdersNum(alipayTradeNo);
|
||||
// orderShowService.updateOrders(orders);
|
||||
|
||||
// 更新订单未已支付
|
||||
ordersMapper.updateState(tradeNo, "已支付", gmtPayment, alipayTradeNo);
|
||||
}
|
||||
}
|
||||
return "success";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
package com.muyu.cloud.market.controller;
|
||||
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
public class WebController {
|
||||
|
||||
@GetMapping("/")
|
||||
public String hello() {
|
||||
return "success";
|
||||
}
|
||||
|
||||
}
|
|
@ -74,6 +74,8 @@ public interface OrderShowMapper {
|
|||
@Select("select * from orders where orders_num = #{ordersNum}")
|
||||
Orders selectByordersNum(String ordersNum);
|
||||
|
||||
void updateState(String tradeNo, String 已支付, String gmtPayment, String alipayTradeNo);
|
||||
|
||||
/**
|
||||
* 订单修改支付状态后,更改该商品的销量
|
||||
*/
|
||||
|
|
|
@ -52,8 +52,10 @@ spring:
|
|||
# rabbit 配置文件
|
||||
- application-rabbit-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
|
||||
|
||||
alipay:
|
||||
appId: 9021000140633904
|
||||
appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCavSHP47iS43En9+MaR8ussAQmI9AbqhZYfb1yROE1ztMUmV9QJqmNiTdA2Tihn+srBG9AzVeJ/0XCqRlH8mFz5FXdsCG1M2EIPgiBYX58EJ565vAgHKRA/d/kKCA5MVkWYu6YiU/V2Pqw/X8K8/FNxXYvaHpjZwpjDqJCzvy4iK4DtM4QQoZRsVr0cOycYJSiC5A6+1wCpP4ZFNL9JdaQLCkLavAeRiRpwedtdW7B+malQEUomylZMwFaB0XJS+8oPlzqYf5RDyNYret4AZzfw0ke6fm3N7ygk3TTBZ9uKfqUNRHdpJ6/uIcHFE7MO16nyoxWHlM/u9i5vmxzhgKtAgMBAAECggEAdc+z85zUhXmHSL/x96tcBeGJdyRjKPzpwHwThfGtahNLIG7ZY6PcCbfECqqX9G5WVU0uCy+MC7QAgAHRDrcavWrGeV/FejlhEi5wuVjqPTlGABreDgTghd8E3Kg0SHcq9eFi+V3qG830qFaIqGUsfmLt5ZBtRktIXDzjC2yeezvV3IPHAQw5mTHmcbzz3WLJ8kuXV3gbOAPzV6Ig5pyp2NwdTMpg1Pn6Xfhf9reYnpkesW8Jph5c6P6bJZkQngC0TFQOpK3UfmFPq1dGfD5UcHjx1H4z09ny6rgXdRxvohDsgeiNmWY+rulzpQM8/DdUwwdmSACYAKgJSn6anCqzvQKBgQD6r/cEI/ShHZlLcS/vnc1W76KBpXx89luBo1NsbqwITSPKNktXpsocYuoxe4ednhBW69W71GfROQMw9zwiM1Gym9xs81Zys+IWySwd+J+T26Z1FoifPwW5ZA2cZYqzwZjg8Urw964cjZtmEhyBvGdzfRlFwvXi36ZB8b4wuOHsEwKBgQCeBJ/tGrGW15enkbmkCKSjFje7yVpjsB7ineuXd7QU3GVXNX9n35BvEcBkgx221woInEfyGsYnw13z1kwDPg2jh2tjVRSz2hjr7UNqeEXeuc366PHzoyJdl7K4ut7F5newzJhRqNKerLvTG8Ajta1NCnDevDVSYXgpso+Qw6iuPwKBgDWSJvJekKdhgOHLVVgaW8gpO4wDBkBaESH5+hjg6ah4e555zc30WZqJVMywPkHjhlBc43bZJDpkuZbcLqCMYPgPMKKjuaSXZkhCQ0hAWjGprb+1ygpl2F5O0E3MsUBKrdXcGoy2ESIO7Nd6JVdgIKdgY2cyC4OpEYlkFKWqzLS7AoGAQxR5g6D6VKuPAJ63LPBSW705yakPixQf+FnLwlAZjWWGS8A1JrZcTRo/Dywt+AlPhBo73IYLKqQgBTwqppG4HnyFVPSwRi1GuRjOrqsCFivQSjyLQb81/n9AanVBzscodlBUNQ4y4xM25MZ6CW69c+ADzDofdKpV5XWcxnqY5+cCgYEAoguI4wGcq1ULjOnt2BLhj2X4kU5UJZwFQuV8t5GDl9BoxO31qRCvu7cs3XtMsIaMn6Zvrg/bNjPF7sC1f0uXqCn3AlnVVTaG/jlI5QywJJflG33Hfa0K7j3ivGTU+AUL4LZbXOt9YR7vGjmItyAnZosdAogp50mOA1W0Jla+Aaw=
|
||||
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7rRdHzrcyEdSOLPm3ITg+t/C3tGp9+wl739nOgFExrSD1j1C95tTRGUCqNUQtatiYmlAfwOKzkNhr/XEH/Vvpq5Ei8C4ZBWJqOMw7fQfBE6m5erO/FOuS4pyZCtQZyP9C5nhtYOupnGtq0fmgQaGKk657vszYSMEtpuQaZ5/odUYxRbYP3IHbcK+++PQBarfOdnhNcnR/Ry7TVOC3+da0dogmClPEconZQMwCJ81CJ7Hj4TKKyLTe9bz+J2tkUeNr9Mc72g4ljjftX7k0RBpBpi4HSHJ3SmPLhktiuDOeOGOef88pBgBtFV03/+aFpUEHx/imiHhBMBeNT3kqFV03QIDAQAB
|
||||
notifyUrl: http://8wvpet.natappfree.cc/alipay/notify
|
||||
alipay:
|
||||
appId: 9021000140633904
|
||||
appPrivateKey:
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCavSHP47iS43En9+MaR8ussAQmI9AbqhZYfb1yROE1ztMUmV9QJqmNiTdA2Tihn+srBG9AzVeJ/0XCqRlH8mFz5FXdsCG1M2EIPgiBYX58EJ565vAgHKRA/d/kKCA5MVkWYu6YiU/V2Pqw/X8K8/FNxXYvaHpjZwpjDqJCzvy4iK4DtM4QQoZRsVr0cOycYJSiC5A6+1wCpP4ZFNL9JdaQLCkLavAeRiRpwedtdW7B+malQEUomylZMwFaB0XJS+8oPlzqYf5RDyNYret4AZzfw0ke6fm3N7ygk3TTBZ9uKfqUNRHdpJ6/uIcHFE7MO16nyoxWHlM/u9i5vmxzhgKtAgMBAAECggEAdc+z85zUhXmHSL/x96tcBeGJdyRjKPzpwHwThfGtahNLIG7ZY6PcCbfECqqX9G5WVU0uCy+MC7QAgAHRDrcavWrGeV/FejlhEi5wuVjqPTlGABreDgTghd8E3Kg0SHcq9eFi+V3qG830qFaIqGUsfmLt5ZBtRktIXDzjC2yeezvV3IPHAQw5mTHmcbzz3WLJ8kuXV3gbOAPzV6Ig5pyp2NwdTMpg1Pn6Xfhf9reYnpkesW8Jph5c6P6bJZkQngC0TFQOpK3UfmFPq1dGfD5UcHjx1H4z09ny6rgXdRxvohDsgeiNmWY+rulzpQM8/DdUwwdmSACYAKgJSn6anCqzvQKBgQD6r/cEI/ShHZlLcS/vnc1W76KBpXx89luBo1NsbqwITSPKNktXpsocYuoxe4ednhBW69W71GfROQMw9zwiM1Gym9xs81Zys+IWySwd+J+T26Z1FoifPwW5ZA2cZYqzwZjg8Urw964cjZtmEhyBvGdzfRlFwvXi36ZB8b4wuOHsEwKBgQCeBJ/tGrGW15enkbmkCKSjFje7yVpjsB7ineuXd7QU3GVXNX9n35BvEcBkgx221woInEfyGsYnw13z1kwDPg2jh2tjVRSz2hjr7UNqeEXeuc366PHzoyJdl7K4ut7F5newzJhRqNKerLvTG8Ajta1NCnDevDVSYXgpso+Qw6iuPwKBgDWSJvJekKdhgOHLVVgaW8gpO4wDBkBaESH5+hjg6ah4e555zc30WZqJVMywPkHjhlBc43bZJDpkuZbcLqCMYPgPMKKjuaSXZkhCQ0hAWjGprb+1ygpl2F5O0E3MsUBKrdXcGoy2ESIO7Nd6JVdgIKdgY2cyC4OpEYlkFKWqzLS7AoGAQxR5g6D6VKuPAJ63LPBSW705yakPixQf+FnLwlAZjWWGS8A1JrZcTRo/Dywt+AlPhBo73IYLKqQgBTwqppG4HnyFVPSwRi1GuRjOrqsCFivQSjyLQb81/n9AanVBzscodlBUNQ4y4xM25MZ6CW69c+ADzDofdKpV5XWcxnqY5+cCgYEAoguI4wGcq1ULjOnt2BLhj2X4kU5UJZwFQuV8t5GDl9BoxO31qRCvu7cs3XtMsIaMn6Zvrg/bNjPF7sC1f0uXqCn3AlnVVTaG/jlI5QywJJflG33Hfa0K7j3ivGTU+AUL4LZbXOt9YR7vGjmItyAnZosdAogp50mOA1W0Jla+Aaw=
|
||||
alipayPublicKey:
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7rRdHzrcyEdSOLPm3ITg+t/C3tGp9+wl739nOgFExrSD1j1C95tTRGUCqNUQtatiYmlAfwOKzkNhr/XEH/Vvpq5Ei8C4ZBWJqOMw7fQfBE6m5erO/FOuS4pyZCtQZyP9C5nhtYOupnGtq0fmgQaGKk657vszYSMEtpuQaZ5/odUYxRbYP3IHbcK+++PQBarfOdnhNcnR/Ry7TVOC3+da0dogmClPEconZQMwCJ81CJ7Hj4TKKyLTe9bz+J2tkUeNr9Mc72g4ljjftX7k0RBpBpi4HSHJ3SmPLhktiuDOeOGOef88pBgBtFV03/+aFpUEHx/imiHhBMBeNT3kqFV03QIDAQAB
|
||||
notifyUrl: http://rnkig5.natappfree.cc/alipay/notify
|
||||
|
|
|
@ -79,6 +79,8 @@
|
|||
UPDATE `orders` SET `orders`.`exist` = 1 WHERE `orders`.`orders_id` = #{ordersId}
|
||||
</update>
|
||||
|
||||
<update id="updateState"></update>
|
||||
|
||||
<!-- 彻底删除(根据orderid删除数据库字段)-->
|
||||
<delete id="delByOrderId">
|
||||
DELETE FROM `orders` WHERE `orders`.`orders_id` = #{ordersId}
|
||||
|
|
Loading…
Reference in New Issue