GPay 创付 · 开发者文档
签名与验签
签名算法与易支付(MD5)完全一致,可以直接复用你熟悉的所有库函数。
生成签名(下单时)
- 取要提交的参数(不含
sign、sign_type),按参数名升序(按字节序比较,与 Java/PHP 的ksort/SORT_STRING一致)排序。 - 拼成
a=b&c=d&e=f(不做 URL 编码,按原始值拼接字符串)。 - 末尾直接追加你的
key(不加 &)。 - 对整个串做 MD5,输出 32 位小写十六进制,即
sign。
params = {pid=10012, type=wxpay, ...}
query_string = "money=9.90&name=AI+...&out_trade_no=order-9527&pid=10012&return_url=...¬ify_url=...&type=wxpay"
sign = md5(query_string + key) # key 直接追加,没有&
验签(回调时)
- 解出表单参数,剔除
sign和sign_type。 - 按参数名升序拼接,末尾追加
key,MD5 小写。 - 与收到的
sign做常量时间比较(避免时序侧信道),一致则验签通过。
常见错误
- 含中文参数未原样参与:签名用原始 UTF-8 字符串,不要先 URL 编码再签。
- 排序错了:
money在name前面;必须严格按键名升序,不要按插入顺序。 - 把 sign/sign_type 也参与了签名:这两个字段排除在签名之外。
- key 里有换行或空格:从控制台复制时多带了空白。
- PHP 用
http_build_query拼接:http_build_query会做 urlencode,导致签名串与发送串不一致——用你自己的拼接(如k=v&手拼)或对比前统一 urlencode 即可,只要两边一致。
调试建议
先用 /epay/query?act=order 验证 key 可用(签名不需要验签,直接返回结果);再逐步过渡到验签回调。控制台「API 密钥」页的密钥初始仅显示一次,丢了只能轮换。