支付宝支付开发流程与原理【沙箱环境】

支付宝支付流程:
1、A网站以POST请求方式提交参数给支付宝接口,在支付宝端进行支付处理。

POST请求方式一定程度下保证了安全性,即在url上看不到参数,但可以在浏览器开发者工具中可以看到参数,为防止篡改,则可以采用一些加密协议,如:https、加签名、加密手段(MD5加盐、base64、DES、sha1)等。

在加密中又可以分为对称加密(base64、des等)与非对称加密(RSA公钥与私钥的互换)。

那么在支付宝中主要使用什么方式进行加密呢? 加签名和RSA非对称加密。

2、在支付宝接口中,把支付的结果通知给A网站(成功/失败),以便更新订单的状态信息。

那么支付宝怎么把支付结果返回给A网站呢?有两种通知/回调方式:1、同步通知(同步回调) 2、异步通知(异步回调)

同步通知:当A网站以post请求方式将参数提交给支付宝接口,支付宝会返回同步通知给A网站,意味着A网站需要提供一个接口给支付宝,而同步通知实际上是:本地浏览器的重定向操作,告知A网站支付成功还是失败,不做订单状态的更改。

异步通知:为了安全性考虑,一般需要进行订单状态的更改时,使用异步通知,即支付宝服务器使用httpclient技术调用A网站的接口进行通知,A网站解析报文,判断到底是支付成功还是支付失败。异步通知包含补偿机制,即:支付宝把结果异步通知给A网站,若A网站未及时响应给支付宝,则支付宝会进行补偿重发,类似与MQ。所以在网络存在延迟的情况下,需要解决支付回调的幂等性问题,解决方式跟MQ很相似——使用全局ID。

回调方式:同步回调、异步回调

回调场景: 告诉商户支付通知结果

同步回调: 整个支付流程完毕,使用同步方式将参数重定向给商户平台,一般场景用于展示结果。

异步回调: 第三方支付接口发一个后台通知给商户平台,一般场景用户修改订单信息。

public class AliPayController {
    /**
     * APP_ID  应用id
     */
    private final static String APP_ID="\t\n" +
            "2021000118657154";
    /**
     *应用私钥
     */
    private final static String APP_PRIVATE_KEY="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDRM6nCXLfJZ8zBjwybboRCQ93Q31GPcLSSLPHZe8xalprWy75mkQGmY5hxjSSPxW+eWxfPXyJKRG4tcogKoo8xTB5m1VKsnESkFYaOl93UUXonc6qY0sjNjqsFqqMuIMllvwATGn4URRxk4xtf5kNKSYgdZukn6T9MhUFA6UZLJsY+MxJCMrp8KdAjKVWFdzGzXD+esqCC/l3E+ZhjVtvhb/LZOkUuJOx19MR4T+ayTKasSZ1AVBM0L9sLKwxdhCk7ai70nPEFkvLqqunE/4nBJYyGc+5TQqlMm20mZSO2vCg4ia0jtdgo9wQFb9HMVohkxWfC+gN9YxmoGHeXDZZjAgMBAAECggEBAKwriJqdE+R9uNXTlNyWp+KhV/x+zfDvIKzssF38tMIZEHWWWKywylrVvLA3KM/p/WKmNYJFGUNl7gcZKz0VbCN2Mc8P4WqNcTBZRtQzyCzkoVO2rb/4Oapyr+2J8aIU+ary9mzCcODdv/CHuA/Ewbxxp8QK3fgqzh17zahOU7ukQA8qQyQcBrMx0YZLRlGzp/e3zsrzENkIicO7zYw/9S1xrZmh9WPdyikOc0OZpmMRvE72V8VuUR0CNVj2qe2MSxezjDWdmwzSyDxPPhyldjELWMW/aCRRuWjrTu2/4yT4DAd2s4+1pOWjtVAtYuMkZKdlq12WfTbVPl9lwX29/AECgYEA9XKp7/kG+YgEthw1j1Z2Gxt6KNXjQifgRriz0OiRLM7rGV6c9X2LG8VBIlRPeSsmEFA/7c69oRSItgNAA3ofHOq8WKNtlFHMQiWwklseHCqRuzWixUALp7W4/tTLIDLjkL4S8DcK+CkJRosxEzvdSEmeC9prUXxV6/QVNM2mB4MCgYEA2jIVihsncx3yzkZNjbJ8+r6dVKn4BHWTon6wxnRAx2LVODNiFM6oohr6u37XwGVk3NSLg5HCFNAzs6wzA41mJW7VnLWveQ4Uz4e7t0WQO5ZrEPMkU6knOJjCudaBZ4Hk9yrdIZfL9rqNi7eX4rXNbtSOBPCFwkS0OdTzsEc+H6ECgYAE8ZJKqxFg5URzBo5tnKg0U5FaUTSKmJMD2aSFiKmj5WcG08kFiMnMfWSadGhFYIEbwwIGoCthmzBFujsH1uXZh0DT6DbEzgD3NBsiV4N7vb/BrYrhvjB96EMZnt+Yfm3m9G0dOX6XEPyG1zbd1E7YreLpCjUvJvn0Dq5+qcW2UQKBgEnrEbT5wgGTscADvR41y3U+whn+gtEv69XuyYBRvehOKSGi9qVJ5YMVVL/UFs9NCkBtmN33sSJP7lP+EEIx0tr3k1JFkq6WAKLVvtg1rskhCiBx3mqhMXJQ/hbq/mfMb370fHl27VgmlvEwPzpEkNXtGDfAK/BGSjAVXoDngbpBAoGAdcf8eyFBeuC6dQfA1OIV/Z5dOYRJsT1L+gLHY5fKlti0K98MjeRXhogd9Te7hm0EVmmNhOPSmid2nhpPWR0oL/zqiKo+AlYhGbE7vroJkZaQhMgBXF5PXQeHQdEOMf3n/jz/K/IyPNfWvhpvVzpKtYbjmFr7FxSSEWsOnEFwvBw=";
    /**
     * 编码
     */
    private final static String CHARSET="UTF-8";
    /**
     * 支付宝公钥
     */
    private final static String ALIPAY_PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuIY3ODKN7Nm6rTp4C3EaQmjaZaJa5H3I2o3sLGJjZcESe7q0CZr5zLtF+7eIN/csk+ahrFyKAtjBYfFkLn1dFzULuIX9cYXZXuO4O4WaxBXbIGjEXv5/Sd4Qcc360Fu3/wQAHPvUKpp8xn55g92FTmYtdxZQOj91Wp+GI2B4+7RTog+5KBAW2Gh0qZIcBZD8IZpU+SmRFYWf97veyNM1bbIsjMKLDOGgSFt+3W/7VRxb5/LjpyTjdja056yWw3QJ+vUr/skKv+8Zcht/OUizmyVcFK6oU9/oc2IKBiil5bpjlVqWCFR+kZ+KADxLljD3FS8xu1eSnSZnF6LQDITDRQIDAQAB";
    /**
     * 沙箱公关
     */
    private final static String GATEWAY_URL ="https://openapi.alipaydev.com/gateway.do";

    /**
     * 格式化
     */
    private final static String FORMAT ="json";

    /**
     * 签名类型
     */
    private final static String SIGN_TYPE ="RSA2";
    /**
     * 获取订单信息
     */
    public void getOrderInfo(){
        //实例化客户端
        AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setBody("我是测试数据");
        model.setSubject("App支付测试Java");
        model.setOutTradeNo("张三158");
        model.setTimeoutExpress("30m");
        model.setTotalAmount("99");
        model.setProductCode("QUICK_MSECURITY_PAY");
        request.setBizModel(model);
        request.setNotifyUrl("商户外网可以访问的异步地址");
        try {
            //这里和普通的接口调用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
    }
    public static void main (String[] args){
        AliPayController aliPayController=new AliPayController();
        aliPayController.getOrderInfo();
    }
}

加密方式
在支付领域,数据安全肯定是首要的任务,加密种类可分为:单向加密、对称加密、非对称加密。

最安全的肯定是RSA:公钥与私钥的互换,效率不如单向加密和对称加密高,但安全性很好,要想破解,必须知道公钥和私钥两把密钥,属于非对称加密。

单向加密:如MD5、SHA等不可逆【不能解密,只能加密】,主要用来验证数据传输的过程中,是否被篡改过。

对称加密:一方通过密钥将信息加密后,把密文传给另一方,另一方通过这个相同的密钥将密文解密,转换成可以理解的明文。

明文 <-> 密钥 <-> 密文 【可以加密,又可以解密】

常用对称加密方案 DES、AES、Base64

非对称加密:在支付领域一般都使用RSA非对称加密。在通信双方,如果使用非对称加密,一般遵从这样的原则:公钥加密,私钥解密。同时,一般一个密钥加密,另一个密钥就可以解密。

因为公钥是公开的,如果用来解密,那么就很容易被人解密消息。因此,私钥也可以认为是个人身份的证明。

如果通信双方需要互发消息,那么应该建立两套非对称加密的机制(即两对公私钥密钥对),发消息的一方使用对方的公钥进行加密,接收消息的一方使用自己的私钥解密。

每个人生成一个“私钥-公钥”对,这个私钥需要每个人自行进行保护!公钥可以随便分享,后面详细说,同时,生成的这个“私钥-公钥”对还有个强大的功能就是,使用私钥加密的信息,只能由该私钥对应的公钥才能解密,使用公钥加密的信息,只能由该公钥对应的私钥才能解密!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值