就像在知乎上:我来怒答一下

细数支付宝支付接入的种种

  • 我只用过网页支付和手机版网页支付,APP 相关完全不懂
  • 我具体只看过即时到帐相关的两个
  • 我只具体看过 Java 的 SDK
BUG

本来打算去支付宝论坛发帖咨询的,结果特么的,需要版主审核身份……
都什么年代了,还用这样。
这小破论坛里面的提问也是不找边际,回答也是模棱两可。
要不是想贴个请求上去问问,我才不会去登录……
竟然还要审核,不知道现在审核过了没有。


  • 使用 RSA 加密验证的时候要求提交公钥
    • 登录、支付密码把控在财务手里,很多工程师是没有权利知晓的。
    • 工程师只能生成 key,转码以后存为 txt 让财务上传。
    • 不可预知才是是否多加了空格和回车(这点上支付宝竟然自己不愿意做校验和过滤,反而要求用户来做)
    • 财务告诉我,同样一段,在 Chrome 下不行,IE 下就行。Win7 SP2。

首先确认上传的位置是否是RSA的下面,注意不要是DSA,无线目前不支持DSA加密;
另外请检查上传的格式中是否去除注释、空格、换行等,必须是一行的字符串 ,删除文件头“-----BEGIN PUBLIC KEY-----”与文件尾“-----END PUBLIC KEY-----”及空格、换行。
http://help.alipay.com/support/help_detail.htm?help_id=488520&sh=Y&tab=null&info_type=9


如果商家同时使用 无线网站支付 以及 网站支付,那将是噩梦一般的集成过程。
分别下载的 SDK,里面代码除了包名类名相同之外,其他基本都不同……

简单粗暴的合并方式就是把另外一边的代码直接复制到想同类里面,然后这个类就惨不忍睹了。


两套代码却共用相同一套配置:AlipayConfig
网站样例里面是:public static String sign_type = "MD5";
无线网站里面是:public static String sign_type = "0001";

0001 代表 RSA,而 MD5 就用 MD5,这常量定义得好诡异


以下这段代码,摘录自 无线支付的样例中

构造请求参数的时候做了如下判断,在非无线网站中却没有这段。

if(! sPara.get("service").equals("alipay.wap.trade.create.direct") && ! sPara.get("service").equals("alipay.wap.auth.authAndExecute")) {
    sPara.put("sign_type", AlipayConfig.sign_type);
}

这段代码隐含一个意思:如果是 支付宝无线支付, sign_type 传出去的是 null,但是你们文档里面 sign_type 是必填的。
做了下测试,如果把 sign_type 传值了,结果返回的是“签名验证失败”
呵呵……


下面这类代码满天飞……

if(AlipayConfig.sign_type.equals("MD5") ) {
    // 
}
if(AlipayConfig.sign_type.equals("0001") ){
    //
}

这样的代码意味着,如果你使用了网站和无线网站支付,则你必须使用同一种签名方式,但是恰恰默认的签名方式是不同的……
别以为机智地加一个变量名自己控制好用哪个就没事了,人家只拿这个全局变量的……

我曾经这样干

AlipayConfig.sign_type == 'MD5'
AlipayConfig.sign_type_mobile == '0001'

构建请求参数的时候装模作样地传入 sign_type

sParaTempToken.put("sec_id", AlipayConfig.sign_type);
或者
sParaTempToken.put("sec_id", AlipayConfig.sign_type_mobile);

buildRequest 时候他偷偷通过上面那段来处理签名,索性你就全部隐藏掉好了,让我自以为自己很机智……


无线支付中调用 AlipaySubmit.getRequestToken 的地方会 throw exception。
如果签名获得 token 的 request 出错了,无法解析返回的 token,其实这段 token 变成了,告诉你错误原因的一个 HTML 页面……
至于如何改进参照下面那点。


某些返回 HTTP Status 不合理
“签名验证错误” 你返回一个 HTML 页面,HTTP Status Code 是 200,是不合理的。应该返回是什么,请参照《图解 HTTP》。
因为返回的是 200,造成上面那个 exception。
当然了在 HttpProtocolHandler 也完全没处理 status code。


总体来说无线流程比网站要好一些
无线做法是先请求 token,拿着 token 去做之后操作,而网站是没有这个流程的。


if (paraText.get("res_data") != null) {
            String res_data = paraText.get("res_data");
            if(AlipayConfig.sign_type.equals("0001")) {
                res_data = RSA.decrypt(res_data, AlipayConfig.private_key, AlipayConfig.input_charset);
            }
            
            Document document = DocumentHelper.parseText(res_data);
            request_token = document.selectSingleNode( "//direct_trade_create_res/request_token" ).getText();
        }

这段代码是在我重写的时候非常纠结的一段,原本没注意当中那 0001 所以在测试的时候总是不过。看到这段,才看明白。这代码写得,额……

最后呢,放弃 RSA了,全部都是用的 MD5,就像你们客服回答我一样:RSA 不对?那改用 MD5 啊。


还有其他的一些,比如 ALIPAY_GATEWAY_NEW 这特么是函数的入参……

public static String buildRequest(String ALIPAY_GATEWAY_NEW, Map<String, String> sParaTemp, String strMethod, String strButtonName) {}

最后贴一个图,我明白做客服是很烦躁,但是,我觉得我的要求还是挺合理的。

a.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容