[Lua]微信支付宝支付签名及验签

-- @function: 微信签名
-- @param: 短信参数,secret,签名方法(MD5)
-- @return: ecode, 签名
function common.weixin_sign_to_request(params, secret, signMethod)
--第一步:把param按Key的字母顺序排序
if type(params) ~= 'table' then
return ecode.ARGS_ERR
end
local sign_data = common.alipay_sort_by_key(params)
--第二步:把所有参数名和参数值串在一起
ngx.log(ngx.DEBUG, "排序后: ", sign_data)
--第三步: 拼接API密钥
sign_data = sign_data.."&key="..constants.WEIXIN_API_KEY
ngx.log(ngx.DEBUG, "sign_data:", sign_data)
--第四步: 使用MD5进行签名
local sign = string.upper(ngx.md5(sign_data))
ngx.log(ngx.DEBUG, "sig length: ", #sign)
ngx.log(ngx.DEBUG, "sig data: ", sign)
return ecode.OK, sign, sign_data
end
-- @function: 支付宝签名
-- @param: 参数,secret,签名方法(SHA)
-- @return: ecode, 签名
function common.alipay_sign_to_request(params, secret, signMethod)
--第一步:把param按Key的字母顺序排序
if type(params) ~= 'table' then
return ecode.ARGS_ERR
end
local sign_data = common.alipay_sort_by_key(params)
--第二步:把所有参数名和参数值串在一起
ngx.log(ngx.DEBUG, "排序后: ", sign_data)
ngx.log(ngx.DEBUG, "sign_data:", sign_data)
--第三步: 使用SHA1withRSA进行签名
local resty_rsa = require "resty.rsa"
local algorithm = "SHA1"
local priv, err = resty_rsa:new({ private_key = constants.RSA_PRIV_KEY, algorithm = algorithm })
if not priv then
ngx.log(ngx.DEBUG, "new rsa err: ", err)
return ecode.SYS_ERR
end
local sign, err = priv:sign(sign_data)
if not sign then
return ecode.SYS_ERR
end
ngx.log(ngx.DEBUG, "sig length: ", #sign)
sign = ngx.encode_base64(sign)
ngx.log(ngx.DEBUG, "sig data: ", sign)
return ecode.OK, sign, sign_data
end
-- @function: 支付宝验签
-- @param: 参数,secret,签名方法(SHA)
-- @return: ecode, 签名
function common.alipay_sign_verify(params, sign, secret, signMethod)
if type(params) ~= 'table' then
return false
end
--把param按Key的字母顺序排序,把所有参数名和参数值串在一起
local sign_data = common.alipay_sort_by_key(params)
ngx.log(ngx.DEBUG, "排序后: ", sign_data)
local algorithm = "SHA1"
local resty_rsa = require "resty.rsa"
local pub, err = resty_rsa:new({ public_key = constants.RSA_PUBLIC_KEY, algorithm = algorithm })
if not pub then
ngx.log(ngx.ERR, "new rsa err: ", err)
return false
end
ngx.log(ngx.DEBUG, "alipay sig data: ", sign)
sign = ngx.decode_base64(sign)
local verify, err = pub:verify(sign_data, sign)
if not verify then
ngx.log(ngx.ERR, "verify err: ", err)
return false
end
return true
end
-- @function: 键值对Table排序(按Key排序,不是Value)
-- @param: 待排序table
-- @return: 排序后string
function common.alipay_sort_by_key(tbl)
sort_string = ""
local key_table = {}
--去除所有的键
for k,v in pairs(tbl) do
table.insert(key_table, k)
ngx.log(ngx.DEBUG, "1key: ", k, ", val: ", v)
end
--对所有键进行排序
table.sort(key_table)
for k,v in pairs(key_table) do
--把所有参数名和参数值串在一起
sort_string = sort_string..v.."="..tbl[v].."&"
ngx.log(ngx.DEBUG, "2key: ", v, ", val: ", tbl[v])
end
if #sort_string>=1 then
sort_string = string.sub(sort_string, 0, #sort_string-1)
end
return sort_string
end