【问题标题】:Dynamic Paypal button encryption动态 Paypal 按钮加密
【发布时间】:2011-05-05 14:48:45
【问题描述】:

我正在使用 PHP 和 Mysql 设计一个订单站点。在最后阶段,用户将获得 Paypal 按钮以支付他所下订单的费用。因此,项目名称、值是变量。 这些值是变量,我不能使用 Paypal 的加密按钮。在向用户显示之前,我必须使用未加密的按钮或对其进行加密。

出于安全原因,我希望对其进行加密。我想知道如何在我的服务器上执行此操作。

【问题讨论】:

    标签: php paypal


    【解决方案1】:

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

        <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
        business=contact@mybiz.com
        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 
    

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

    现在的理论是,要获得加密字段,很好地加密,您需要使用您的证书(x509 证书)和您的私钥对这些值进行签名,然后您需要使用 paypal 的公共证书加密此签名消息。

    进入实践,你可以(需要)使用以下两个 PHP 函数(OpenSSL 扩展的一部分):openssl_pkcs7_sign 和 openssl_pkcs7_encrypt。

    我发现这最后一部分的设置非常棘手,所以我建议您在此处下载适用于 PayPal 的 PHP SDK:https://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 类这为您提供了非常容易的加密按钮;如果您想查看骨骼,请查看为您提供 signAndEncrypt 方法的 PPCrypto 类,该方法只为您提供该字段所需的加密字符串,并显示加密按钮的过程。

    顺便说一句,如果您不知道如何获取您的证书和您的私钥(和/或 Paypal 的证书),请查看此处:https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_encryptedwebpayments#id08A3I0N30Y4

    【讨论】:

    • 顺便说一下,如果您不知道如何获取您的证书和您的私钥(和/或 Paypal 的证书),请看这里:cms.paypal.com/us/cgi-bin/…
    • 最佳解决方案。应标记为答案。实际上讲述了如何动态加密贝宝按钮。
    • @GuyLowe 数据使用 PayPal 的公共证书加密,他们能够很好地解密,因为他们持有相应的私钥。
    • @GuyLowe 数据使用您的私钥签名,然后加密,当 PayPal 解密时,他们会以纯文本格式获取按钮的数据以及您的私钥签名,以确保数据不是被篡改,他们使用你上传的公共证书来验证签名,他们可以因为业务字段而知道是你,并因为 cert_id 字段而使用正确的证书。
    • @GuyLowe,如果你对细节感兴趣,我建议你阅读公钥密码学。
    【解决方案2】:

    从您的帖子中,您似乎对加密的含义和应用它感到非常困惑。什么是威胁模型? (即如何颠覆)。

    您不应该期望贝宝总是处理您发送到客户浏览器的订单。您必须检查 Paypal 的处理过程。

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

    【讨论】:

    • 太棒了。当我发布这个对我关闭的问题时,我没有想到这一点(stackoverflow.com/q/14489512/105539)。因此,只需使用“自定义”变量,并且可能需要在其中添加其他内容,例如添加 md5($sSalt . $sProduct . $sPrice) 并确保它们在 IPN 流程中对齐。
    • 这不是提问者正在寻找的解决方案。他可能已经在这样做了。使用加密按钮的原因首先是通过使发送被篡改的付款变得非常困难,从而大大减少威胁。
    【解决方案3】:

    也许您可以尝试将这些变量放在具有唯一 ID 的临时表中。然后将该ID用于按钮。每当客户单击贝宝按钮时,都会从表中查询变量。我只是希望我能正确理解你的说法xD

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 我认为 IPN 可能是解决这个问题的方法。那个或自定义按钮。我会进一步研究它......
      • 注意:IPN 会在付款后进行检查,因此您仍然会有收到被篡改付款的情况。虽然他们没有得到产品,但看起来有点混乱,因为您会不时收到被篡改的付款。
      【解决方案5】:

      我开发了一个PHP integration toolkit with PayPal Website Payments Standard

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

      PS:助手类只实现IPN确认。

      【讨论】:

      • 链接已失效。请修复或删除。
      【解决方案6】:

      难道没有人知道您的 paypal 电子邮件地址会向您发送虚假发票,以错误的价格向您索要产品名称吗?如果他们要通过更改您的 js/html 代码来向您发送虚假发票的麻烦......他们可以自己编写(只是提交到“paypal.com/cgi-bin/webscr”的表格)。您真正需要的只是卖家的贝宝电子邮件,对吗?

      那么为什么要加密按钮呢?

      【讨论】:

      • 任何人都可以在浏览器的支付页面上按F12 键,然后根据需要编辑 HTML。降低金额是显而易见的,除非您在发货前检查匹配项(由 PayPal 推荐),否则他们会更便宜。即使您发现了差异,您也不得不与客户发生争执并可能退还款项。使用加密按钮,可以防止所有重要信息被篡改,并且在您的 PayPal 首选项中,您只能允许加密按钮,从而防止出现您的情况。
      猜你喜欢
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 2012-09-04
      • 2011-04-13
      • 2023-03-04
      • 2013-01-02
      相关资源
      最近更新 更多