小周做公众号做了一年,想加个话费充值赚点差价。谈了三家上游,拿到接口文档,第一版下午就写完了,晚上接真实订单,十单里三单提示签名错误。
签名错不是密钥错,多半是拼串顺序和编码。文档里那行小字,决定了能不能跑通。
签名串的构造顺序不能凭感觉
常见做法是把非空参数按 key 的 ASCII 升序排,拼成 key=value 加 and 的形式,末尾接上分配给你的密钥,再做 MD5 或 SHA256,转大写。参数里有中文手机号归属地之类的字段,要按 UTF-8 编一次,GBK 环境算出来的值一定对不上。
金额单位经常是分不是元
- 面值 50 元的话费,接口里一般传 5000,传 50 会被判为无效订单
- 返回体里的金额同样按分返回,展示前记得除以 100
- 涉及折扣结算的,用整数分计算,浮点数会差几分钱
回调要验签也要防重
上游回调通常三到五次,间隔递增。收到后先验签,再查本地订单状态,已经成功的直接返回 success,别重复给用户加积分。回调处理超过五秒会被判超时,重试继续推,所以别在回调里同步发短信,扔进队列。
订单状态别只写成功和失败
真实状态至少有:已提交、处理中、成功、失败、已退款。充值时运营商系统排队,处理中可能持续几十秒。页面上直接显示处理中,比反复点重试体验好,重复提交会生成两笔订单。
上游挂了怎么办
只接一家,出问题整条业务停摆。至少两家轮询,按面值和运营商分流。别把余额全压在一家,预付款模式的上游跑路新闻每年都有几起。
每天对一次账
上游一般提供对账文件或者查询接口,按订单号拉当天的成功单,和自己库里的逐条比。差额多半来自回调丢失,补单前先确认上游状态,别直接重发,重发就是二次扣款。差异超过三笔就停下来查,别拖到第二天,账越拖越乱。
小周的签名问题最后查出来是排序时把空值参数也带上了,去掉就通了。做代理这行利润薄,能把订单状态和回调做扎实,就已经比多数同行稳。