java对接支付宝支付-最新全过程

原创不易,有帮助的点赞和收藏

先按照步骤一步步来。

1.先申请一个账号

·注册蚂蚁金服开发者账号(免费)

注册地址:https://open.alipay.com,用你的支付宝账号扫码登录,完善个人信息,选择服务类型(选自研)。

在这里插入图片描述

2.注册完之后进入沙箱环境配置秘钥

2.1
https://openhome.alipay.com/platform/appDaily.htm 此处直达沙箱。
在这里插入图片描述

2.2
https://opendocs.alipay.com/open/291/105971
到达此地址生成秘钥

在这里插入图片描述
2.3
直接生成秘钥(公钥+私)就可以了。

在这里插入图片描述

接下来正片:

3.代码部分

3.1 application.yml

alipay:
  #appid
  appid: 2016102700769693;
  #商户私钥,PKCS8格式RSA2私钥
  merchant_private_key: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCEnTNTQxR+KBKV7EX2tbzdh50MF7gQrA
 6R3FfMejli/Y61F5WpbA9yVisV6Jnc4guqUxHGv+Y3FKixV4VBXC2Vx/XRNG7UikU62IH3/2Rd4n/LY8o5haIHGlDCxq4ERJGbNuN1XeAmIrnToLe5TAQKBgQDib+X114l6op6iThtdC1mkiLmreVrjStLf3PV9VLJIDDDIiTXK2/P8mB26ofHjSyMFKyhUm3hBrQ2mrlw71Q12JrojrD9zy3W+l4n8/QF1LzKy/j8RqPA7C6mHa/B+MndAtNndnOLawWDduDgNgZDP9iUklI1s2H5dvXzbjHMsWQKBgQCV7X+gRz5slj47OisNH1lRNhBu+71LjfzegrxtW4+6beyA5ET3QCIw0RBb5g5fSAEfpEkX7fAiiUA1Uming66JjpYHXPBzP0HtmP8JbHqCurOdCCOp9KxrFMxhPmTz2C/vuUAOVNpkK9buPyr251/vus0dvEsfkjWV5AC8YrJlCwKBgBQp+sRlqSxuhsnVQsKKXDU2p7IJYHqVEyo0NvguLqIT09RHw66I37VCpoMUIMIo0rmHGlROc+sFSg3pwPTjCAvZbwH2OMBLAfUy8WrB7PtOdKlT0rHz5VCcvT/98LCMNephMHV3nwvz5HhaC0PIoeii9rPHNsDWlooqcY/rdeYhAoGAdGdwNr35zo8cBBoWgNq9GxuRyMl1YCr+kLgKmhGD1ygvfqc8kIdfxG0deWx17i5WiP2hro2Taw0LKBsynBTWN4DYJSFYovITOukV4ngx6jwQ5jQClJseHwmH4VxzPwuztDktbbMd2LZc6p9quUZNKzDqvlKKNRnsttLOa3Vpsp8CgYEA2YbrZ390IFkG2yieQ4DjLT1sNpSArLb84+c2TsOjby7QZtIGUOGTV0rhhoKQW73X3BUw5KCTcDOa/NeI3NxHtl5hK8f5CPgxMAM29uRabQleb1Fb1Rf4Q0TFD4627yfBAABBiWVCV2EImcYGCpLbORuLoO9//5dYc2lYtOvnEbM=;
  #支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
  alipay_public_key: MIIBIjANBgkqhkxyWQx7+bPk53oE5KOZOwOn+MWcMBYxukvlt+pceQjkaN26L0HUD8OtDF39wgnILDj3LgSpcPRPtblR/Og8vNiMYGFwIDAQAB;
  # 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数
  notify_url: http://xxxx:端口/error.html
  # 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数
  return_url: http://xxx:端口/sccess.html
  # 签名方式
  sign_type: RSA2
  # 字符编码格式
  charset: utf-8
  # 支付宝网关
  gatewayUrl: https://openapi.alipaydev.com/gateway.do

3.2 config文件如下

@Configuration
@ConfigurationProperties(prefix = "alipay")
@Data
public class AliPayConfig {

    //
    private String appid;

    //私钥
    private String merchantPrivateKey;

    //公钥
    private String alipayPublicKey;

    private String notifyUrl;

    private String returnUrl;

    private String signType;

    private String charset;

    private String gatewayUrl;

	//此处是dev、prod环境使用的证书方式
    public AlipayClient getAlipayCertClient() throws AlipayApiException {

        //构造client
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
        //设置网关地址
        certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
        //设置应用Id
        certAlipayRequest.setAppId(appid);
        //设置应用私钥
        certAlipayRequest.setPrivateKey(merchantPrivateKey);
        //设置请求格式,固定值json
        certAlipayRequest.setFormat("json");
        //设置字符集
        certAlipayRequest.setCharset(CharsetUtil.UTF_8);
        //设置签名类型
        certAlipayRequest.setSignType(AlipayConstants.SIGN_TYPE_RSA2);

        //设置应用公钥证书路径
        certAlipayRequest.setCertPath("");
        //设置支付宝公钥证书路径
        certAlipayRequest.setAlipayPublicCertPath("");
        //设置支付宝根证书路径
        certAlipayRequest.setRootCertPath("");
        //构造client
        return new DefaultAlipayClient(certAlipayRequest);
    }

//测试方法
    public AlipayClient getAlipayClient() throws AlipayApiException{
        AlipayClient alipayClient = new DefaultAlipayClient(
                gatewayUrl,//支付宝网关
                appid,//appid
                merchantPrivateKey,//商户私钥
                "json",
                charset,//字符编码格式
                alipayPublicKey,//支付宝公钥
                signType//签名方式
        );

        //返回付款信息
        return  alipayClient;

    }
}

3.3 controller文件

@Autowired
    private PayService payService;

    /**
     * 支付接口
     */
    @PostMapping("/pay")
    @ApiOperation(value = "调起进行支付", notes = "调起进行支付")
    @SneakyThrows
    public ResponseEntity<?> pay(HttpServletResponse httpResponse, @Valid @RequestBody PayParam payParam) {
        PayInfoDto payInfoDto = payService.payInfoInit(payParam);
        return payService.doPay(httpResponse,payInfoDto);
    }

payService文件

public interface PayService {

    /**
     * 功能描述: 支付前封装
     * 〈〉
     * @Param: [payParam]
     * @Return: com.jarjar.mallcloud.demo.bean.dto.pay.PayInfoDto
     * @Author: tonyJarjar
     * @Date: 2020/10/29 13:31
     */
    PayInfoDto payInfoInit(PayParam payParam);

    /**
     * 进行支付
     * @param httpResponse
     * @param payInfo
     * @return
     * @throws IOException
     */
    ResponseEntity<?> doPay(HttpServletResponse httpResponse, PayInfoDto payInfo) throws  IOException, AlipayApiException;

}

PayServiceImpl文件

@Service
public class PayServiceImpl implements PayService {

    @Autowired
    private Snowflake snowflake;
    @Autowired
    private AliPayConfig aliPayConfig;

    @Override
    public PayInfoDto payInfoInit(PayParam payParam) {
        PayInfoDto payInfoDto = new PayInfoDto();
        if (payParam.getOrderType()==1)
            payInfoDto.setPayAmount(900d);
        payInfoDto.setBody("免广告购买");
        payInfoDto.setPayNo(String.valueOf(snowflake.nextId()));
        payInfoDto.setBizUserId("1111");
        payInfoDto.setPayType(payParam.getPayType());
        payInfoDto.setApiNoticeUrl("/notice/pay/order/" + payParam.getPayType());
        payInfoDto.setReturnUrl(payParam.getReturnUrl());
        return payInfoDto;
    }

    @Override
    public ResponseEntity<?> doPay(HttpServletResponse httpResponse, PayInfoDto payInfo) throws IOException, AlipayApiException {
        AlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest();
        alipayRequest.setNotifyUrl(aliPayConfig.getNotifyUrl());
        AlipayTradeAppPayModel alipayTradeAppPayModel = new AlipayTradeAppPayModel();
        alipayTradeAppPayModel.setOutTradeNo(payInfo.getPayNo());
        alipayTradeAppPayModel.setSubject(payInfo.getBody());
        alipayTradeAppPayModel.setTotalAmount(Double.toString(payInfo.getPayAmount()));
        alipayTradeAppPayModel.setProductCode("QUICK_MSECURITY_PAY");
        alipayRequest.setBizModel(alipayTradeAppPayModel);

        //String body = aliPayConfig.getAlipayCertClient().sdkExecute(alipayRequest).getBody();
        String body = aliPayConfig.getAlipayClient().pageExecute(alipayRequest).getBody();
        return ResponseEntity.ok(body);
    }

最终结果展示
在这里插入图片描述

ps:沙箱环境和正式环境一样的。所以真正要测试自己的key的时候只需要替换参数即可。
一般都使用证书方式去调起支付,可以参考config的另外一个client

通尼渣渣
文章皆为原创,转载请注明作者

觉得有帮助的不妨点赞收藏、也可以将疑惑的地方私信或者评论我。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值