每一个软件基本都有支付功能,我这边使用了alipay实现简单的支付功能,可以配合二维码生成一起使用(Java实现生成二维码_大白猫~的博客-CSDN博客):
0.加依赖
com.alipay.sdk
alipay-easysdk
2.2.0
commons-logging
commons-logging
1.2
1.书写yml文件(不知道怎么获取的可以看视频或者问chatGPT)
alipay:
# 支付宝沙箱环境或正式环境
easy:
# 通讯协议 可以是http 也可以是https[需要服务器配置SSL证书的]
protocol: http
## 网关地址 沙箱环境是alipaydev 正式环境是alipay
gatewayHost: openapi.alipaydev.com
# 签名方式
signType: RSA2
# 应用ID
appId: #你的应用id
# 应用私钥
merchantPrivateKey: #你自己的应用私钥
# 支付宝公钥
alipayPublicKey: #你自己的应用公钥
# 是用于进行敏感数据加密和解密的密钥[可选]
encryptKey: #你的数据加解密密钥
# 授权回调地址[可选]
#支付成功后可以阿里会调用你的接口提示
notifyUrl: http://localhost:8080/pay/aliPay/notify
2.支付宝配置类
(1)先获取信息
@Configuration
@Data
@ConfigurationProperties(prefix = "alipay.easy")
public class AliPayProperties {
//请求协议
private String protocol;
// 请求网关
private String gatewayHost;
// 签名类型 RSA2
private String signType;
// 应用ID
private String appId;
// 应用私钥
private String merchantPrivateKey;
// 支付宝公钥
private String alipayPublicKey;
// 异步通知接收服务地址
private String notifyUrl;
// 设置AES密钥
private String encryptKey;
}
(2)再配置
@Configuration
public class AlipayConfiguration {
@Bean
public Config config(AliPayProperties payProperties) {
Config config = new Config();
config.protocol = payProperties.getProtocol();
config.gatewayHost = payProperties.getGatewayHost();
config.signType = payProperties.getSignType();
config.appId = payProperties.getAppId();
// 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中
config.merchantPrivateKey = payProperties.getMerchantPrivateKey();
//注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可
config.alipayPublicKey = payProperties.getAlipayPublicKey();
//可设置异步通知接收服务地址(可选)
config.notifyUrl = payProperties.getNotifyUrl();
//可设置AES密钥,调用AES加解密相关接口时需要(可选) <-- 请填写您的AES密钥 -->
// 接口内容加密方式的加密密钥
config.encryptKey = payProperties.getEncryptKey();
// 设置参数(全局只需设置一次)
Factory.setOptions(config);
return config;
}
}
3.编写接口
@RestController
@RequestMapping("/ali")
@Api(tags = "支付宝收付款")
public class AliPayServlet {
@Resource
private QRService qrService;
/**
* 支付
*
* @param subject 商品标题
* @param code 订单编号
* @param totalMoney 支付金额
* @return {@link R}
*/
@PostMapping("pay")
@ApiOperation("获取支付二维码")
@ApiImplicitParams({@ApiImplicitParam(name = "subject", value = "商品名称"),@ApiImplicitParam(name = "code", value = "商品订单号"),@ApiImplicitParam(name = "totalMoney", value = "支付金额")})
public void pay(String subject, String code, String totalMoney, HttpServletResponse resp) throws Exception {
AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace().preCreate(subject, code, totalMoney);
if (ResponseChecker.success(response)) {
// 请求支付成功,生成支付二维码
if (Objects.equals(response.getCode(), "10000")) {
resp.setHeader("content-type", "image/png");
qrService.generateToStream(response.getQrCode(), resp);
}
}
}
@PostMapping("/payurl")
@ApiOperation("获取支付二维码地址")
@ApiImplicitParams({@ApiImplicitParam(name = "subject", value = "商品名称"), @ApiImplicitParam(name = "code", value = "商品订单号"), @ApiImplicitParam(name = "totalMoney", value = "支付金额")})
public R paycode(String subject, String code, String totalMoney, HttpServletResponse resp) throws Exception {
AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace().preCreate(subject, code, totalMoney);
if (ResponseChecker.success(response)) {
// 请求支付成功,生成支付二维码
return R.ok(response.getQrCode());
}
return R.fail("");
}
/**
* 查询支付状态
*
* @param code 订单编号
* @return {@link R}
*/
@GetMapping("query")
@ApiOperation("查询支付状态")
@ApiImplicitParams({@ApiImplicitParam(name = "code",value = "订单号")})
public R queryPayState(String code) throws Exception {
AlipayTradeQueryResponse response = Factory.Payment.Common().query(code);
String tradeStatus = response.getTradeStatus();
if (StringUtils.isEmpty(tradeStatus)) {
return R.fail("交易不存在");
} else if (Objects.equals(tradeStatus, "WAIT_BUYER_PAY")) {
return R.ok("等待买家付款");
} else if (Objects.equals(tradeStatus, "TRADE_SUCCESS")) {
return R.ok("支付成功");
}
//具体详情标识可以查看官方文档以及chatGPT
return R.fail("状态查询失败");
}
}
这样一个简单的阿里支付就完成了,今天的分享就到这里了