倒腾了几天一直报签名错误,后来通过微信官方提供的签名验证工具,发现是julia的SHA包有问题,hmac_sha算出来的结果根本就不对……作者也没更新,于是直接换成Nettle,用另一个包的加密算法得到了正确哈希值
但依然签名错误,这里要注意一点,第一波签名所用到的key,并不是appsecret,而是在微信商户平台上自行设置的key
https://pay.weixin.qq.com/index.php/core/cert/api_cert
搞定了这个之后就签名通过了,然后返回一堆参数,再签名一次传给app就行了
using Nettle
appsecret_hasher = HMACState("sha256",apicertpasswd) # 这里用了hmac_sha256方法,并非默认值,需要在参数中说明。MD5我没跑通
function appsecret_sign(x)
update!(appsecret_hasher,x)
return hexdigest!(appsecret_hasher)
end
function wxsign(dic_nosign::Dict,apicertpasswd::String,toxml::Bool=false)
prepay_data = sort(collect(dic_nosign),by=x->x[1])
prepay_str = join( map(x->x[1]*"="*string(x[2]),prepay_data), "&" ) * "&key=" * apicertpasswd
sign_str = uppercase(appsecret_sign(prepay_str))
if toxml
push!(prepay_data,"sign"=>sign_str)
prepay_str = "<xml>"
for p in prepay_data
k,v = p[1],string(p[2])
prepay_str *= "<$k>"*v*"</$k>"
end
prepay_str *= "</xml>"
return prepay_str
else
dic_nosign["sign"] = sign_str
return dic_nosign # signed
end
end
除了签名用到的key需要测试核实,其他参数都比较好找,照着微信官方文档的示例值来就行,在开放平台管理中心都能找到