前言
支付宝支付之PC生成二维码 成功并回调
一、所需SDK
<!--支付宝支付-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-easysdk</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.0.0</version>
</dependency>
二、前端调用接口
1.生成二维码
代码如下(示例):
//配置
@Value("${project.servlet}")
String servlet;
@PostMapping("/test") //订单类
public R createOtherOrder(@RequestBody PayOrder payOrder) throws Exception
{
//支付方式支付宝
payOrder.setType(1);
//随机订单号
String number = YitIdHelper.nextId()+"";
payOrder.setId(Long.valueOf(number));
//订单创建时间
payOrder.setCreateTime(new Date());
//支付状态
payOrder.setState(0);
//订单创建
payOrderMapper.insert(payOrder);
//生成二维码
AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace()
.asyncNotify(servlet + "/payBack/aliPay")
.preCreate("支付", number, payOrder.getAmount().toString());
// 订单号 金额toString
//判断调用成功失败
if (ResponseChecker.success(response)) {
return data(response);
} else {
System.out.println(response);
throw new BusinessException("支付失败,请联系管理员");
}
}
2.成功回调
代码如下(示例):
//支付宝支付回调
@PostMapping("/aliPay")
public String alipayapp2(@RequestParam Map<String, String> data) throws Exception
{
Boolean aBoolean = Factory.Payment.Common().verifyNotify(data);
if (!aBoolean) {
return "sign fail";
}
List<String> strings = Arrays.asList("TRADE_SUCCESS", "TRADE_FINISHED");
if (strings.contains(data.get("trade_status")))
return process2(data.get("out_trade_no"), data.get("trade_no"), data.get("buyer_logon_id")).toLowerCase();
else return "success";
}
private String process2(String payOrderId, String orderNo, String openid)
{
PayOrder payOrder = payOrderMapper.selectById(payOrderId);
if (payOrder == null) {
System.out.println("订单不存在");
return "SUCCESS";
}
//成功后业务处理省略
········
payOrder.setState(1);
payOrderMapper.updateByPrimaryKey(payOrder);
if (payOrder.getState() == 1) {
System.out.println("订单已完成");
return "SUCCESS";
}
return "SUCCESS";
}
3.yml配置 证书
alipay:
protocol: https
gateway-host: openapi.alipay.com
sign-type: RSA2
app-id: xxx
merchant-private-key: xxx
alipay-public-key: xxx
merchant-cert-path: xxx
alipay-cert-path: xxx
alipayRoot-cert-path: xxx
4.启动类加载config
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @description
*/
@Component
@Slf4j
public class AlipayInitializer implements ApplicationRunner {
@Autowired
AlipayConfig config;
@Override
public void run(ApplicationArguments args) {
Factory.setOptions(config.parseToConfig());
log.info("alipay配置加载成功");
}
}
@Data
@ConfigurationProperties(prefix = "alipay")
@Component
class AlipayConfig{
private String protocol;
private String gatewayHost;
private String signType;
private String appId;
private String merchantPrivateKey;
private String alipayPublicKey;
private String merchantCertPath;
private String alipayCertPath;
private String alipayRootCertPath;
public Config parseToConfig(){
Config config = new Config();
config.protocol=protocol;
config.gatewayHost=gatewayHost;
config.signType=signType;
config.appId=appId;
config.merchantPrivateKey=merchantPrivateKey;
config.alipayPublicKey=alipayPublicKey;
//设置应用公钥证书路径
config.merchantCertPath=merchantCertPath;
//设置支付宝公钥证书路径
config.alipayCertPath=alipayCertPath;
//设置支付宝根证书路径
config.alipayRootCertPath=alipayRootCertPath;
return config;
}
}
总结
支付宝支付 首先调用生成二维码 扫码支付成功后回调