对接支付宝支付问题(大章,不定期更新)
2017-11-16 16:38
459 查看
背景
因产品需要,近日在做对接各大支付平台和银行的工作,立贴总结遇到的支付问题。总结
总结一下遇到的坑,因为支付宝支付接口存在新旧关系,并且今年的改版变动挺大,很多旧接口都不好用了。正文
在对接支付宝时,请先准备支付宝开发者账号,要有企业或个体户认证。接着,再创建自己的应用,创建应用的同时,需要创建公钥私钥(参考公钥私钥传送门),接着把应用公钥绑定到应用上,并拉取支付宝公钥到你的程序里存储。
然后,要在应用里签约对应的功能,审核完毕后可调用对应接口。
在正式对接前,需要有知识点储备,要知道公钥私钥、签名相关的技术,若不清楚,请移步先了解签名是什么传送门。
支付流程简介:
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。
….(未完待续)
相关文章推荐
- Django对接支付宝APP支付问题
- 支付宝对接支付问题
- 支付宝app支付对接2(文档和对接注意问题)
- 【Python】不定期更新学习小问题整理
- 邮件编码问题汇总(不定期更新)
- IOS支付宝支付出现6002问题的解决办法
- 支付宝客户端支付配置RSA公钥的问题错误,导致收不到回发通知
- 支付宝支付集成以及遇到的问题ios
- FLASH CC 2015 CANVAS 实际应用过程中遇到的【粉色】问题(不定期更新)
- 新版支付宝WAP支付成功回调接口验签失败问题解决办法
- Kotlin 语法使用问题-不定期更新
- ecmobile实现支付宝支付和百度云推送遇到的问题及解决方案(android)
- 模电的一些零碎问题,不定期更新
- 第三方支付至支付宝对接
- 使用openvr开发Oculus时手柄按键的问题(不定期更新)
- node.js项目开发问题集锦(不定期更新,随时把开发过程中遇到的问题加上)
- 支付宝国际支付 对接
- nodejs 新手问题汇总-不定期更新
- 服务端支付宝App支付对接笔记
- appframework学习--appframework开发常见问题及解决方法(不定期更新)