2018年6月19日
[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