支付接口开发总结,支付宝接口、通联接口

主要知识点:会使用httpclient、理解回调和通知机制、理解session机制

支付宝开发主要就是三个接口:一个是下订单的接口。

这个接口中,先存储自己的订单业务逻辑。
然后根据自己支付宝注册成为商户时,支付宝提供给你的商户appid、私钥,来实例化一个支付宝的客户端。

AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,
                        AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key,
                        AlipayConfig.sign_type);

然后实例化一个存储参数的类,在这个类中,设置同步通知和异步通知地址,还需要设置支付宝需要的几个参数,可以在支付宝的商户中心查看支付宝需要的参数api。

AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();

然后调用client的pageExcute方法就可以执行了

String  result = alipayClient.pageExecute(alipayRequest).getBody();

方法执行成功后,会跳到支付宝的二维码支付页面,当用户支付成功后,支付宝会调用同步通知地址,这时浏览器的url会重定向到你在上一步,拼参数时设置的同步通知地址。

这也就是第二个接口:在这个接口中,需要验证发消息的是否是支付宝。
也就是验签,验证签名成功后可以执行自己的业务逻辑。
也即把上一个接口中存储的订单信息都改为已支付啥的。

boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset,
                AlipayConfig.sign_type); // 调用SDK验证签名

参数都是从request中获取的,支付宝提供的实例中有demo,demo中的api都是可以用的。

这个先获取ISO-8859-1格式再转为UTF-8的api尤其好用,我在弄通联接口的时候,因为tomcat默认ISO-8859-1编码,所以我一开始就是遇到了编码转换错误,造成生成签名总是出错。

String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

第三个接口是支付宝的异步通知接口,在这个接口中,可以做一些验证工作,也就是防止同步通知出问题,导致本地订单信息没有修改。
接口的最后一定要返回success,不然支付宝会一直八次。

通联支付开发就是真的坑了,第一个坑就是编码问题,通联提供的demo中没有提到编码格式,导致我压根没注意格式问题。再加上通联有近三十个参数,所以验签失败我一直以为是我参数拼接错误。
第二个坑就是我先开发的支付宝,所以我错误的把通联接口开发也按照支付宝的流程走,就是生成一个httpclient,然后拼接请求的request,最后返回页面给用户浏览器。

我这个逻辑是没问题的,但是我忽略了通联的sesison验证。站在通联的视角,就是我用服务器拦截了用户的请求,并且自己拼接请求,再把请求发送给通联,并且把通联的相应返回给用户。这在通联看来是不安全的,通联不希望我拦截用户的请求。

通联的demo是用表单的post方式提交的,所以我认为,必须能让用户浏览器使用post方法提交,服务端不能拦截数据,要让浏览器直接与通联交互。

所以,可以模仿在支付宝的做法,查看支付宝源码,得知,支付宝在服务端得到参数后,手动拼接了一个form表单。返回给浏览器,让浏览器执行。

public static String buildForm(String baseUrl, Map<String, String> parameters) {
        java.lang.StringBuffer sb = new StringBuffer();
        sb.append("<form name=\"punchout_form\" method=\"post\" action=\"");
        sb.append(baseUrl);
        sb.append("\">\n");
        sb.append(buildHiddenFields(parameters));

        sb.append("<input type=\"submit\" value=\"绔嬪嵆鏀粯\" style=\"display:none\" >\n");
        sb.append("</form>\n");
        sb.append("<script>document.forms[0].submit();</script>");
        java.lang.String form = sb.toString();
        return form;
    }

猜你喜欢

转载自blog.csdn.net/qq_37804737/article/details/81091818