支付宝拍照赚钱机制的签名机制是怎样的

生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier
简单的知识点
本文基本分初级、进阶、高级三部
初级适用群体:使用 demo 或 SDK 系统,对 RSA 规则不熟悉的同学
进阶适用群体:使用 SDK 系统,对 RSA 规则熟悉的同学
仅使用SDK需要对开放平台规则略有了解。
适合遇到网关返回报文中描述错误。
高级适用群体: 不使用 demo或 SDK、完全独立。对RSA 规则熟悉的同学
注:推荐使用 SDK。否则请直接跳高级说明。
推荐使用 demo 或者 SDK。可以节约同学学习RSA规则的时间。
初次对接开放平台接口时建议选择参数较少的简单接口对接,方便调查问题。
产品分 mapi 网关产品及 openapi 网关产品。
mapi 网关均使用PID调用,需配置合作伙伴秘钥。
因 mapi 多使用 md5验签,问题较少,因此本文仅介绍开放平台规则。
openapi 网关产品均使用 appid 调用,需在appid上分别配置秘钥。
如有多个 appid, 使用相同秘钥或者不同秘钥均可,只需保证自己调用时使用配对秘钥加签即可。
对于新接入产品的,生成密钥、开放平台设置密钥 很重要
&?点击查看
详解查询 账号PID.
&?点击查看
推荐使用在线地址中生成工具,该工具同样可做秘钥校验作用.(问题排查工具)
&?点击查看
在此页面可以上传商户公钥及查看公钥(支付宝公钥唯一,因此代码中不做修改最好,以免节外生枝.)
&?点击查看
参考文中的配置方法将第二步中生成的私钥填写.
注意最新.netdemo 对aop.DefaultAopClient方法做了改善,添加了两个参数.最后一个参数keyFromFile.
为true时直接写私钥本地路径.
默认 false, 需要将私钥内容转成一行填入方法中.
进阶教程主要针对在使用时碰到错误的同学
一般平台返回签名错误 个人建议按照初级教程仔细核对一遍.
可能原因1:账号多人使用,被其他同事或者其他公司员工修改
建议跟商户相关负责人沟通,看谁有可能修改秘钥,因为修改秘钥需要短信验证码,所以肯定能查出问题根源.
绑定手机号应该是公司相对高层人士,与其沟通不要随便将短信码给其他人.
可能原因2:自己误操作导致公钥不匹配
在开放平台有多个应用,上传公钥时需上传系统使用 appid 相同应用的商户公钥.
生成了多套秘钥或者其他原因导致程序里私钥与平台设置的公钥不匹配
该问题建议使用初级教程:[RSA秘钥生成]中的工具做排查,校验公私钥是否匹配.
如不匹配可使用私钥重新生成公钥配置到开放平台.
或者重新生成一套按初级教程:上传公钥重新配置
可能原因3:如果调用api中传参包含中文,则很有可能是因为编码问题导致开放平台验签失败.
调查方法,将参数中所有中文替换成英文重试接口调用,如果成功说明是编码影响平台验签.
修改方法,参考初级教程:demo&sdk使用方法在DefaultAopClient方法中传入相应编码集.
下面介绍出现这个问题的原因,感兴趣的同学可以看下.
中文包含多种编码集,而你们系统有默认编码集,当你参数中含有中文且在调用签名方法时没有指明编码集,系统会使用默认编码集进行签名.而调用接口时需传入charset参数, 如果你没传入,平台会使用默认编码集utf-8解签,如果你系统默认utf-8编码,那么此问题你无感知,但如果是非utf-8类型编码会导致平台算签名串与你实际传入不符. 最终验签失败
系统直接报错,抛出的异常建议自己先分析.
常见的异常就是获取私钥失败.可能的原因如下(低级错误请仔细排查)
使用java但是私钥未经过pkcs8转码
使用.net开发,参考初级教程:demo&sdk使用方法,未对keyFromFile做有效控制.
复制私钥没复制全.
其他异常均属于代码错误,建议先自己排查.实在搞不定可以联系技术支持协助解决.
高级教程针对不使用 SDK开发的同学(安全考虑/冷门语言等原因)
高级教程需要你首先了解初级教程,并且进阶教程中的常见问题也可以自己排查解决.
本文主要探讨开放平台签名规则,如不使用sdk开发,这些逻辑代码均需要自己开发.
建议开发前先参考 sdk 源代码看下实际
&?点击查看
mapi网关产品签名时要去掉sign_type=RSA,这点跟openapi网关产品不同,一定要注意.
排序时不要仅排序第一个字符,要注意第一字符相同时排第二字符,以此类推.
所有空参数不在签名参数中,注意剔除.异步通知(需要解签报文)同理
支付宝异步通知不会有空参数
邵珠庆推荐文章
博文加载中...
anyShare分享到:
喜欢这个文章吗?
还没有评论.
还没有引用.
关于邵珠庆博客
最近评论记事邵珠庆博客
2011年07月 邵珠庆博客建立
2011年11月 邵珠庆博客PR5
2017年九月
111213151617
192021222324
252627282930问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
支付宝回调,得到这样一个数组(数组只是形式,并不是真实数据)
'discount' =& '0.00',
'payment_type' =& '1',
'subject' =& '测试02',
'trade_no' =& '106821',
'buyer_email' =& '',
'gmt_create' =& ' 11:30:08',
'notify_type' =& 'trade_status_sync',
'quantity' =& '1',
'out_trade_no' =& '3',
'seller_id' =& '7261',
'notify_time' =& ' 11:54:40',
'body' =& '测试02',
'trade_status' =& 'TRADE_SUCCESS',
'is_total_fee_adjust' =& 'N',
'total_fee' =& '0.01',
'gmt_payment' =& ' 11:30:09',
'seller_email' =& '',
'price' =& '0.01',
'buyer_id' =& '',
'notify_id' =& 'ba20b13f6lk2',
'use_coupon' =& 'N',
'sign_type' =& 'RSA',
'sign' =& 'Bn6IEyE9=',
然后ksort()排序,去除sign_type,sign,拼接成body=Hello&buyer_email=&buyer_id=3600..............这样字符串
openssl_verify(`拼接字符串`, base64_decode($_POST['sign']), $publickey);
总返回 0 ,验证不成功,是哪一步出错
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
请问解决了吗?我也遇到这个问题了,直接用的官方php sdk,总是返回0.
该答案已被忽略,原因:
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:工具类(11)
支付宝 工具类
支付宝 签名获取 key
public class OrderInfoUtil2_0 {
* 构造授权参数列表
* target_id
public static Map&String, String& buildAuthInfoMap(String pid, String app_id, String target_id) {
Map&String, String& keyValues = new HashMap&String, String&();
keyValues.put("app_id", app_id);
keyValues.put("pid", pid);
keyValues.put("apiname", "com.alipay.account.auth");
keyValues.put("app_name", "mc");
keyValues.put("biz_type", "openservice");
keyValues.put("product_id", "APP_FAST_LOGIN");
keyValues.put("scope", "kuaijie");
keyValues.put("target_id", target_id);
keyValues.put("auth_type", "AUTHACCOUNT");
keyValues.put("sign_type", "RSA");
return keyV
* 构造支付订单参数列表
* target_id
public static Map&String, String& buildOrderParamMap(String app_id) {
Map&String, String& keyValues = new HashMap&String, String&();
keyValues.put("app_id", app_id);
keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"0.01\",\"subject\":\"1\",\"body\":\"我是测试数据\",\"out_trade_no\":\"" + getOutTradeNo() +
keyValues.put("charset", "utf-8");
keyValues.put("method", "alipay.trade.app.pay");
keyValues.put("sign_type", "RSA");
keyValues.put("timestamp", " 16:55:53");
keyValues.put("version", "1.0");
return keyV
* 构造支付订单参数信息
* 支付订单参数
public static String buildOrderParam(Map&String, String& map) {
List&String& keys = new ArrayList&String&(map.keySet());
StringBuilder sb = new StringBuilder();
for (int i = 0; i & keys.size() - 1; i++) {
String key = keys.get(i);
String value = map.get(key);
sb.append(buildKeyValue(key, value, true));
sb.append("&");
String tailKey = keys.get(keys.size() - 1);
String tailValue = map.get(tailKey);
sb.append(buildKeyValue(tailKey, tailValue, true));
return sb.toString();
* 拼接键值对
* isEncode
private static String buildKeyValue(String key, String value, boolean isEncode) {
StringBuilder sb = new StringBuilder();
sb.append(key);
sb.append("=");
if (isEncode) {
sb.append(URLEncoder.encode(value, "UTF-8"));
} catch (UnsupportedEncodingException e) {
sb.append(value);
sb.append(value);
return sb.toString();
* 对支付参数信息进行签名
待签名授权信息
public static String getSign(Map&String, String& map, String rsaKey) {
List&String& keys = new ArrayList&String&(map.keySet());
Collections.sort(keys);
StringBuilder authInfo = new StringBuilder();
for (int i = 0; i & keys.size() - 1; i++) {
String key = keys.get(i);
String value = map.get(key);
authInfo.append(buildKeyValue(key, value, false));
authInfo.append("&");
String tailKey = keys.get(keys.size() - 1);
String tailValue = map.get(tailKey);
authInfo.append(buildKeyValue(tailKey, tailValue, false));
String oriSign = SignUtils.sign(authInfo.toString(), rsaKey);
String encodedSign = "";
encodedSign = URLEncoder.encode(oriSign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "sign=" + encodedS
* 要求外部订单号必须唯一。
private static String getOutTradeNo() {
SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());
Date date = new Date();
String key = format.format(date);
Random r = new Random();
key = key + r.nextInt();
key = key.substring(0, 15);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13337次
排名:千里之外
原创:66篇
(1)(3)(1)(5)(4)(27)(10)(17)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'}

我要回帖

更多关于 阿里云签名机制demo 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信