2013-07-31 63 views
0

是否有方法通过不使用PayPal SDK为第三方生成身份验证标头。我已经获得了他们的访问令牌和秘密。然而,这些都是通过对我来说很直接的卷曲请求。无论如何要这样做?生成身份验证标头

另外,要生成头文件,我需要第三方的API签名?我如何得到这个?

谢谢你的帮助。

+0

您能澄清这是哪种产品? – Robert

+0

当然。我正在使用1c企业版,并且我如何通过将Curl调用分解为HTTPRequests等进行调用。这里是我如何调用请求令牌的示例(替换了我的API详细信息)。在这种情况下,我必须尝试以相同的方式获取api签名或身份验证标头。可悲的是,这是我能做的极限。 http://pastebin.com/UWir6t35 – user2631182

+0

对不起,我的意思是贝宝产品。看着粘贴,我可以看到你的意思是权限API。 – Robert

回答

4

为别人寻找的node.js解决方案的PayPal X-PAYPAL-Authorization头值,我写了这个:

function PayPalURLEncoder(s) 
{ 
    var hex = "abcdef"; 
    var untouched = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"; 
    var result = s.split('').map(function(c){ 
     if (untouched.indexOf(c)>=0) { return c; } 
     else if (c==' ')    { return "+"; } 
     else 
     { 
      // Needs converting to HEX 
      var code = c.charCodeAt(0); 
      return "%" + hex.charAt((code & 0xf0) >> 4) + hex.charAt(code & 0xf); 
     } 
    }); 
    return result.join(''); 
} 

exports.authorizationToken = function(accessToken,method,endpoint) 
{ 
    var PARAM_DELIMETER = "&"; 
    var PARAM_SEPERATOR = "="; 
    var token = { key : accessToken.token, secret : accessToken.tokenSecret}; 
    var consumer = { key : global.config.paypal.username, secret : global.config.paypal.password }; 

    // Add params 
    var params = { 
     "oauth_consumer_key" : consumer.key, 
     "oauth_version" : "1.0", 
     "oauth_signature_method" : "HMAC-SHA1", 
     "oauth_token" : token.key, 
     "oauth_timestamp" : Math.round(new Date().getTime()/1000), 
    }; 

    // Convert params into paramString 
    var paramKeys = []; 
    var paramString = ""; 
    for (var p in params) { paramKeys.push(p); } paramKeys.sort(); 
    for (var i=0; i<paramKeys.length; i+=1) 
    { 
     var p = paramKeys[i]; 
     paramString += (p + PARAM_SEPERATOR + params[p]); 
     if (i+1<paramKeys.length) paramString += PARAM_DELIMETER; 
    } 

    // Create signature 
    var key = PayPalURLEncoder(consumer.secret) + PARAM_DELIMETER + PayPalURLEncoder(token.secret); 
    var signatureBase = method + PARAM_DELIMETER + PayPalURLEncoder(endpoint) + PARAM_DELIMETER + PayPalURLEncoder(paramString); 
    var signature = CryptoJS.HmacSHA1(signatureBase, key).toString(CryptoJS.enc.Base64); 
    return "token="+token.key+",signature="+signature+",timestamp="+params["oauth_timestamp"]; 
}; 

的authToken从使用调用 “/权限/ GetAccessToken” 返回通常的方法,并且包含代表第三方操作的令牌和令牌秘密对。方法将是POST,并且终点将是类似于“https://svcs.sandbox.paypal.com/Permissions/GetBasicPersonalData”的东西。

使用上面的方法可能是这个样子:

exports.basicDetails = function(accessToken, callback) 
{ 
    var http = require('https'); 
    var host = global.config.paypal.sandbox ? 'svcs.sandbox.paypal.com' : 'svcs.paypal.com'; 
    var path = '/Permissions/GetBasicPersonalData'; 
    var options = { 
     host: host, 
     path: path, 
     method: 'POST', 
     headers: { 
      "X-PAYPAL-AUTHORIZATION" : exports.authorizationToken(accessToken,"POST","https://"+host+path), 
      "X-PAYPAL-REQUEST-DATA-FORMAT" : "NV", 
      "X-PAYPAL-RESPONSE-DATA-FORMAT" : "JSON", 
      "X-PAYPAL-APPLICATION-ID" : global.config.paypal.sandbox ? "<<YOURAPPIDSANDBOX>>" : "<<YOURAPPID>>", 
     }, 
    }; 
    var req = http.request(options, function(res){ 
     var str = ""; 
     res.setEncoding('utf8'); 
     res.on('data', function (chunk) { str += chunk; }); 
     res.on('end', function() { 
      if (callback) callback(false,JSON.parse(str)); 
     }); 
    }); 
    req.on('error',function(e){ 
     if (callback) callback("Unable to connect with PayPal"); 
    }); 
    req.end("attributeList.attribute(0)=http://axschema.org/contact/email&attributeList.attribute(1)=http://schema.openid.net/contact/fullname&requestEnvelope.errorLanguage=en_US"); 
}; 
0

基于由阿库共享的代码,我已经把它移植到了Python。不幸的是,这仍然导致错误代码为10002的验证失败响应。FWIW,这里是:

from hashlib import sha1 
import hmac 
from base64 import b64encode 
from urllib import urlencode 
from datetime import datetime 

def paypal_urlencode(s): 
    encode = lambda x: x if x in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_+" else '%%%x' % ord(x) 
    return ''.join(map(encode, s.replace(' ','+'))) 

def paypal_authorisation(token, ep, consumer, method="POST", sandbox=True): 
    params = dict(
     oauth_consumer_key=consumer['key'], 
     oauth_version='1.0', 
     oauth_signature_method="HMAC-SHA1", 
     oauth_token=token['key'], 
     oauth_timestamp=datetime.now().strftime('%s') 
    ) 
    key = "&".join((paypal_urlencode(consumer['secret']), paypal_urlencode(token['secret']))) 
    sig_base = "&".join((method, paypal_urlencode(ep), paypal_urlencode("oauth_consumer_key=%(oauth_consumer_key)s&oauth_signature_method=%(oauth_signature_method)s&oauth_timestamp=%(oauth_timestamp)s&oauth_token=%(oauth_token)s&oauth_version=%(oauth_version)s" % params))) 
    h= hmac.new(key.encode('ascii'), sig_base.encode('ascii'), sha1) 
    signature=b64encode(h.digest()) 

    return "token=%s,signature=%s,timestamp=%s" % (token['key'], signature, params['oauth_timestamp'])