您的位置:首页 > 编程语言 > Java开发

对接支付宝支付问题(大章,不定期更新)

2017-11-16 16:38 399 查看

背景

因产品需要,近日在做对接各大支付平台和银行的工作,立贴总结遇到的支付问题。

总结

总结一下遇到的坑,因为支付宝支付接口存在新旧关系,并且今年的改版变动挺大,很多旧接口都不好用了。

正文

在对接支付宝时,请先准备支付宝开发者账号,要有企业或个体户认证。

接着,再创建自己的应用,创建应用的同时,需要创建公钥私钥(参考公钥私钥传送门),接着把应用公钥绑定到应用上,并拉取支付宝公钥到你的程序里存储。

然后,要在应用里签约对应的功能,审核完毕后可调用对应接口。

在正式对接前,需要有知识点储备,要知道公钥私钥、签名相关的技术,若不清楚,请移步先了解签名是什么传送门

支付流程简介:



2017-11-16 微信公众号使用支付宝支付

在微信公众号访问网站做支付时,由于微信封杀阿里系url,只有做桥接开发了,不能直接唤醒支付宝app或者在线网页支付了,只能做一个中转页,然后goto到新浏览器打开实际支付页面。

解决方案:

1. 新版支付接口统一为alipay.trade.pay,若要实现上述思路跳转浏览器,我们得先生成一个url,而不是利用API生成一个
<from>
,这里要用到旧版接口alipay.trade.wap.pay;

2. 对接时,不能像后台提供的SDK那样,直接通过request往前台输出一个表单访问数据;

3. 找到旧版
alipay.trade.wap.pay
接口说明,参数中
biz_content
内的
total_amount
字段建议按金额类型,而不是以字符串发送,如图1-1;



4. 涉及验签的问题,支付宝提供的规范是这样的,做了很多封装,只需要开发者封装参数,其他的由支付宝SDK自动调用;

public void doPost(HttpServletRequest httpRequest,
HttpServletResponse httpResponse) throws ServletException, IOException {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //获得初始化的AlipayClient
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp");//在公共参数中设置回跳和通知地址
alipayRequest.setBizContent("{" +
" \"out_trade_no\":\"20150320010101002\"," +
" \"total_amount\":\"88.88\"," +
" \"subject\":\"Iphone6 16G\"," +
" \"product_code\":\"QUICK_WAP_PAY\"" +
" }");//填充业务参数
String form="";
try {
form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
} catch (AlipayApiException e) {
e.printStackTrace();
}
httpResponse.setContentType("text/html;charset=" + CHARSET);
httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();


因为我们无法输出一个
<from>
到新开浏览器页面上,所以只能以get请求URL方式访问,那么就有很多事情需要自己做了。先封装好自己的Map

RSA签名方式调用:AlipaySignature.rsaSign(params, privateKey, charset);
RSA2签名方式调用:AlipaySignature.rsa256Sign(AlipaySignature.getSignContent(params), privateKey, "UTF-8");

科普:
签名是对参数集合做签名,简单理解起来就是把内容按顺序全部拼成字符串,之后再签名,若签名前顺序与验签顺序不一致,则肯定失败。
AlipaySignature.getSignContent(params);
这个方法就是用来给参数排序的,为支付宝SDK里看到的代码,签名完毕直接赋值sign即可
sign=AlipaySignature.getSignContent(params);


签名完毕后,要对所有参数进行encode操作,如不做的话,http转码会将一些字符型数据给转乱了,支付宝服务端解码存在不一致的可能,所以规范为,请求encode,验签解码decode。

….(未完待续)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息