前期准备工作
1.创建应用并获取APPID(应用唯一标识)
2.签约功能
3.配置秘钥
4.接入方案:服务端集成SDK接入支付
- 客户端SDK
- 客户端 SDK 需要集成在商户自己的 APP 中,用于唤起支付宝 APP 并发送交易数据,并在支付宝APP返回商户APP时获得支付结果
- 服务端SDK
- 服务端SDK需要商户集成在自己的服务端系统中,用于协助解析并验证客户端同步返回的支付结果和异步通知
实战
1.配置及依赖
- 1.1 依赖
<dependency>
<groupId>com.alipay</groupId>
<artifactId>alipay-java-sdk</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alipay</groupId>
<artifactId>alipay-trade-sdk</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
复制代码
-
1.2 配置
-
1.2.1 初始化调用支付宝SDK需要的实例
@Configuration
public class AliPayConfig {
//app支付配置
@Bean
public AlipayClient alipayClient(){
return new DefaultAlipayClient(
AliPayProperty.SERVER_URL,
AliPayProperty.APP_ID,
AliPayProperty.APP_PRIVATE_KEY,
AliPayProperty.FORMAT,
AliPayProperty.CHARSET,
AliPayProperty.ALIPAY_PUBLIC_KEY,
AliPayProperty.SIGN_TYPE);
}
//扫码支付配置
@Bean
public AlipayTradeService alipayTradeService(){
return new AlipayTradeServiceImpl.ClientBuilder()
.setAppid(AliPayProperty.APP_ID)
.setAlipayPublicKey(AliPayProperty.ALIPAY_PUBLIC_KEY)
.setCharset(AliPayProperty.CHARSET)
.setFormat(AliPayProperty.FORMAT)
.setPrivateKey(AliPayProperty.APP_PRIVATE_KEY)
.setSignType(AliPayProperty.SIGN_TYPE)
.setGatewayUrl(AliPayProperty.SERVER_URL).build();
}
}
复制代码
- 1.2.2 支付宝前期准备工作获取的参数
2.请求参数及返回值
- 请求参数
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AliPayCommand {
private Integer fee;//订单金额 单位分----支付宝接口金额单位统一为元
private String operatorId = "merengues";//操作员工id
private String storeId = "000001";//门店编号
private String title;//标题
private String remark;//备注
}
复制代码
- app支付接口返回值
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class AliPayTradeAppPayResponseDto {
private String body;
public AliPayTradeAppPayResponseDto(AlipayTradeAppPayResponse response) {
this.setBody(response.getBody());
}
}
复制代码
3.代码
3.1 业务处理及支付宝SDK调用
public AliPayTradeAppPayResponseDto generateAppPayInfo(AliPayCommand command) {
AlipayTradeAppPayRequest request = AliPayRequestBuilder.generateAliPayAppRequest(command,aliPayAppCallBack);
AlipayTradeAppPayResponse response = null;
try {
response = alipayClient.sdkExecute(request);
response.setOutTradeNo(((AlipayTradeAppPayModel)request.getBizModel()).getOutTradeNo());
createPayRecord(command, response.getOutTradeNo(),response.getTradeNo(),PayType.ALI, command.getPayChannel());
} catch (AlipayApiException e) {
e.printStackTrace();
}
if (!response.isSuccess()) {
return null;
}
return new AliPayTradeAppPayResponseDto(response);
}
复制代码
3.2 SDK接口请求参数构造
public static AlipayTradeAppPayRequest generateAliPayAppRequest(AliPayCommand command, String notifyUrl){
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setNotifyUrl(notifyUrl);//notify公共参数,支付宝APP支付后支付宝异步调用自己服务的url处理支付成功后的业务
//非公共参数封装在bizModel里面
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody(command.getRemark());
model.setSubject(command.getTitle());//必选
model.setOutTradeNo(generateTradeId());//必选 生成的订单id
model.setTimeExpire(DateUtil.obtainAliPayTimeExpire());
Float floatFee = Float.valueOf(command.getFee().toString()) / 100;
model.setTotalAmount(floatFee.toString());//必选
model.setProductCode(AliPayProperty.MODEL_PRODUCT_CODE);
request.setBizModel(model);
return request;
}
复制代码
总结
- 支付宝接口对接工作难点在于前期准备工作,创建应用获取秘钥公钥支付宝公钥,签约等功能。后期的业务代码相对简单容易理解,在构造SDk请求参数时需要理解不同参数的构造方式。最后支付宝APP支付功能文档提供完成,希望对各位码农开发有所帮助!