支付宝APP支付功能开发

前期准备工作

1.创建应用并获取APPID(应用唯一标识)

创建应用1 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

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支付功能文档提供完成,希望对各位码农开发有所帮助!

猜你喜欢

转载自juejin.im/post/7039622185073246215