码支付API签名字符串(支付宝付款码api)
Android微信支付签名错误这个问题,你是怎么解决的?
有以下几种可能原因及解决办法:
(使用浏览器扫码进入在线客服窗口)
复制联系方式
body字段为中文字符串,但编码不合适,导致传输过程中中文成乱码
解决办法:统一改成其他编码如utf8字符形式传输
API密钥问题
在商户平台把API密钥重新设置就ok
参数名ASCII码未按升序排列,或者是生成MD5字符串没有toUpperCase转换为大写。
到微信官网上用校验工具校验即可。
key错误。这里特别注意,公众平台的密钥和商户号的密钥是不一样的!
微信支付审核成功之后会收到一封邮件,邮件中有appid 商户号,商户后台登录上号和密码,登录到商户后台:账户设置-安全设置-切换到API安全,下载证书,下面有一个api密匙,进去填写一个字符串 ,保存,后续两次签名都是用的这个手动设置的key
timeStamp在后台签名的时候S大写,前台上传的时候S小写
这个应该不会再出现了,因为微信已更正
android api 签名是什么意思
android api 签名是api调用的时候需要按照约定的参数生成一个字符串,对方接收到后校验参数,合法后接受请求并返回结果。
所有android端的API的有效访问URL包括以下三个部分:
1. 资源访问路径,如/v1/deal/find_deals;
2. 请求参数:即API对应所需的参数名和参数值param=value,多个请求参数间用连接
如deal_id=1-85462appkey=00000;
3. 签名串,由签名算法生成
签名算法如下:
1. 对除appkey以外的所有请求参数进行字典升序排列;
2. 将以上排序后的参数表进行字符串连接,如key1value1key2value2key3value3...keyNvalueN;
3. 将app key作为前缀,将app secret作为后缀,对该字符串进行SHA-1计算,并转换成16进制编码;
4. 转换为全大写形式后即获得签名串
签名串获得后,将其作为sign参数附加到对应的URL中,即可正常访问API。
注意:请保证HTTP请求数据编码务必为UTF-8格式,URL也务必为UTF-8编码格式。
参考代码:
// 定义申请获得的appKey和appSecret
String appkey = "XXXXXXXX";
String secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
String apiUrl = "";
// 创建参数表
MapString, String paramMap = new HashMapString, String();
paramMap.put("format", "json");
paramMap.put("city", "上海");
paramMap.put("latitude", "31.21524");
paramMap.put("longitude", "121.420033");
paramMap.put("category", "美食");
paramMap.put("region", "长宁区");
paramMap.put("limit", "20");
paramMap.put("radius", "2000");
paramMap.put("offset_type", "0");
paramMap.put("has_coupon", "1");
paramMap.put("has_deal", "1");
paramMap.put("keyword", "泰国菜");
paramMap.put("sort", "7");
// 对参数名进行字典排序
String[] keyArray = paramMap.keySet().toArray(new String[0]);
Arrays.sort(keyArray);
// 拼接有序的参数名-值串
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(appkey);
for (String key : keyArray)
{
stringBuilder.append(key).append(paramMap.get(key));
}
stringBuilder.append(secret);
String codes = stringBuilder.toString();
// 字符串连接示例
// XXXXXXXXcategory美食city上海formatjsonhas_coupon1has_deal1keyword泰国菜latitude31.21524limit20longitude121.420033offset_type0radius2000region长宁区sort7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// SHA-1编码, 这里使用的是Apache codec,即可获得签名(shaHex()会首先将中文转换为UTF8编码然后进行sha1计算,使用其他的工具包请注意UTF8编码转换)
/*
* 以下sha1签名代码效果等同
* byte[] sha = org.apache.commons.codec.digest.DigestUtils.sha(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(codes));
* String sign = org.apache.commons.codec.binary.Hex.encodeHexString(sha).toUpperCase();
*/
String sign = org.apache.commons.codec.digest.DigestUtils.shaHex(codes).toUpperCase();
//签名示例
//7D78381BC58E1DB1DBA4BD965916FE6B4D5DC892
统一下单参数,随机字符串什么作用
微信支付API接口协议中包含字段nonce_str(随机字符串),参与生成签名,随机以主要保证签名不可预测。
微信小程序-微信支付签名验证
在微信支付之后,小程序会主动向服务端发送支付状态.为了防止恶意篡改,必须生成签名发送给服务端进行验证.
签名生成官方文档:
签名验证分为如下几步:
1.与服务端确认上传的签名内容(即上传参数key=value)以及加密方式.并且要到商户平台设置的密钥key.
2.生成随机字符串nonceStr.
3.将要上传的参数,对参数按照key=value的格式,并按照参数名ASCII字典序排序,比如:
假设传送的参数如下:
appid: wxd930ea5d5a258f4f
mch_id: 10000100
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
则:stringA="appid=wxd930ea5d5a258f4fbody=testdevice_info=1000mch_id=10000100nonce_str=ibuaiVcKdpRxkhJA";
4.拼接API密钥,例如:stringSignTemp=stringA+"key=192006250b4c09247ec02edce69f6a2d" //注:key为商户平台设置的密钥key
5.对拼接秘钥后的字符串进行加密并且转换为大写.(加密方式自定)
6.将参数以及加密得到的sign一起上传给服务端进行验证.
7.查看服务端返回结果.
谢谢大家~
API接口签名验证_MD5加密出现不同结果的解决方法
系统在提供接口给第三方系统使用时,通常为了安全性会做接口加密。
设计原则 :使用HTTPS安全协议 或 传输内容使用非对称加密,这里采用后者。
在对参数进行加密,生成sign时,相同的参数两次加密的结果不一样。
加密规则:
1.拼接出来的字符串不一致
测试时,在加密前将要加密的字符串打印出来比较,发现两次字符串一致。
2.编码问题
加密时,两次的默认编码不一致。
在上述加上默认编码: byte[] btInput = content.getBytes("utf-8"); ,问题解决。
简单实现:
1.接口调用方和接口提供方约定好统一的参数加密算法。
2.接口调用方在调用时把加密后的signature放在参数中去请求接口。
3.判断时间戳有效期。
4.将参数用约定号的加密算法进行加密,与参数中的signature进行比较,一致则调用接口。
输入api提示输入字符串格式不正确,能解决吗?
看错误应是类型转换的时候报的异常,比如转换“lskjfd"为数字型。看看是不是你录入的数据有问题。