2010-11-05 64 views
16

我正在设计一个订购网站使用PHP & Mysql。在最后阶段,用户被给予贝宝按钮来支付他所做的订单。所以,项目名称,值是变量。 这些值是变量,我不能使用贝宝的加密按钮。我必须使用非加密按钮或在将其显示给用户之前对其进行加密。动态贝宝按钮加密

为安全起见,我希望对其进行加密。我想知道如何在我的服务器上做到这一点。

回答

2

也许你可以尝试把这些变量放在一个具有唯一ID的临时表中。然后使用该ID作为按钮。每当客户点击贝宝按钮时查询表中的变量。我只希望我能理解你的陈述权xD

1

你可以做到这一点的唯一方法是动态查询贝宝每次加密按钮。

但是这种方法效率不高,我认为使用PayPal IPN会好得多。网上有很多关于如何做到这一点的例子和课程。

+0

我认为IPN可能是解决这个问题的方法。要么是自定义按钮。我会进一步研究它... – 2011-08-01 18:08:30

+2

注意:IPN会在付款后进行检查,因此您仍然会遇到发送篡改付款的情况。虽然他们没有收到产品,但看起来有点混乱,因为您偶尔会篡改付款发送给您。 – 2013-08-28 19:17:15

29

你需要做的是相当复杂的,第一,介绍,贝宝加密按钮具有以下布局:

<form action="https://www.paypal.com/cgi-bin/webscr" method="post"> 
<input type="hidden" name="cmd" value="_s-xclick"> 
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----MIIIEQYJKo...Encrypted stuff...IF5ioje8JH0LAA+5U7P+tabAMOL37k=-----END PKCS7-----"> 
<input type="image" src="https://www.paypalobjects.com/es_XC/MX/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal, la forma más segura y rápida de pagar en línea."> 
<img alt="" border="0" src="https://www.paypalobjects.com/es_XC/i/scr/pixel.gif" width="1" height="1"> 
    </form> 

CMD字段表示加密的立即购买按钮(检查值的按钮,你要创建),和加密领域是按钮的布局如下的实际内容:

cert_id=ZQCMJTZS27U4F 
    cmd=_xclick 
    [email protected] 
    item_name=Handheld Computer 
    item_number=1234 
    custom=sc-id-789 
    amount=500.00 
    currency_code=USD 
    tax=41.25 
    shipping=20.00 
    no_note=1 
    cancel_return=http://www.company.com/cancel.htm 

注意,这些都是在对= value的格式,一个完整的参考看看这里:https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_Appx_websitestandard_htmlvariables

现在理论上,要获得加密字段,加密很好,您需要用您的证书(x509证书)和您的私钥签署这些值,然后您需要使用贝宝的公共证书对此签名的消息进行加密。实践中,您可以(需要)使用以下两个PHP函数(OpenSSL扩展的一部分):openssl_pkcs7_sign和openssl_pkcs7_encrypt。

我发现这最后一部分设置非常棘手,所以我建议您下载适用于PayPal的PHP SDK:http://www.x.com/ community/ppx/sdks#WPST并直接在此处:https://cms.paypal.com/cms_content/US/en_US/files/developer/PP_PHP_WPS_Toolkit.zip ,这个SDK附带包含方法encryptButton的EWPServices类,它给你加密的按钮很容易;如果你想看看骨头,那么看看PPCrypto类,它为你提供了signAndEncrypt方法,它只给你这个字段所需的加密字符串,并向你显示加密按钮的过程。

+2

顺便说一下,如果你不知道如何获得你的证书和你的私钥(和/或贝宝的证书),请看这里:https://cms.paypal.com/us/cgi-bin/?cmd= _render含量&CONTENT_ID =显影剂/ e_howto_html_encryptedwebpayments#id08A3I0N30Y4 – Rafael 2011-07-31 01:30:28

+0

本教程也是有帮助的:http://www.stellarwebsolutions.com/en/articles/paypal_button_encryption_php.php – curtisblackwell 2013-06-28 08:21:57

+5

最佳解决方案。应该标记为答案。实际上讲述了如何动态加密贝宝按钮。 – 2013-08-28 19:19:18

4

从你的文章看来,你对加密手段以及应用方法似乎非常困惑。什么是威胁模型? (即如何被颠覆)。

您不应该期望贝宝将永远处理您发送到客户端浏览器的订单。你必须检查贝宝的处理过程。

您可以更好地确定订单离开您的网站后的完整性,例如,通过将订单的散列添加到您发送给PayPal的订单号(和盐!)中。这应该允许您在不参考PLU /存储的订单的情况下验证订单(只要处理从PayPal返回的脚本知道盐)。

+0

辉煌。当我发布这个关于我的问题时,我没有想到这个问题(http://stackoverflow.com/q/14489512/105539)。因此,只需使用'custom'变量,并且可能需要在其中添加像md5($ sSalt。$ sProduct。$ sPrice)并确保它们在IPN进程中排队。 – Volomike 2013-01-24 12:57:27

+1

这不是提问者寻找的解决方案。他可能已经在做这个。加密按钮的原因将首先通过非常难以发送篡改付款来大大减少威胁。 – 2013-08-28 19:21:02

2

我公司开发的PHP integration toolkit with PayPal Website Payments Standard

所有你在这里提到的问题是由辅助类内部处理。提供了一些基本配置以便于设置。例如,所有加密变量(您的私钥,公共证书,...)和受限制的配置。文章详细解释了如何使用这些类。

PS:只有IPN确认由辅助类实现的。

0

无法与任何人您的PayPal的电子邮件地址向您发送伪造的发票,在错误的价格询问产品名称?如果他们要经历改变你的js/html代码给你发送虚假发票的麻烦......他们可以写自己的(只是提交给'paypal.com/cgi-bin/webscr'的表单)。你真正需要的是卖家的PayPal电子邮件吗?

那么为什么加密按钮的所有麻烦?

+0

任何人都可以在浏览器的付款页面按'F12'键,然后根据需要编辑HTML。降低金额是显而易见的,除非您在发货前检查比赛(由PayPal推荐),否则便宜。即使您发现了这种差异,您仍然不得不与客户发生争议,并可能会退还款项。使用加密按钮,所有重要信息都不会被篡改,并且在您的PayPal偏好设置中,您只能允许加密的按钮,以防止出现您的情况。 – Patanjali 2018-01-27 00:24:57