从 Shopify 商店卸载应用程序后,从 PHP 应用程序中删除商店详细信息

Posted

技术标签:

【中文标题】从 Shopify 商店卸载应用程序后,从 PHP 应用程序中删除商店详细信息【英文标题】:Delete the store details from PHP Application after uninstalling app from Shopify Store 【发布时间】:2017-09-15 06:28:56 【问题描述】:

我想在从 Shopify 商店卸载应用程序后从 php 应用程序中删除商店详细信息,这些应用程序安装时存储在数据库中,

现在我得到了一些解决方案,如下所示:

$create_webhook = array('webhook'=>array( 
    'topic'=> 'app/uninstalled', 
    'address'=>' mydomainname/uninstalled.php',
    'format'=> 'json'
));

$request_update = $shopify('POST /admin/webhooks.json ', array(), $create_webhook);

但是我们可以在安装时或任何其他时间创建这个 webhook 吗?

【问题讨论】:

您能否提供更多有关您所引用的 PHP 应用程序的信息?这些信息如何存储以及以什么格式存储?我们是在谈论 mysql 数据库还是其他什么? 安装应用程序时您好 Sholt 我已将数据插入 Mysql 但我想在卸载应用程序时从数据库中删除数据 【参考方案1】:

在不知道架构的情况下,很难判断您要删除哪些数据。如果您能够提供一个示例,说明您正在插入哪些数据以及可用的列类型,我们可能会提供更多帮助。

说了这么多,从数据库中删除一行是相当直接的。我假设您正在寻找一个脚本来从数据库中删除某些内容,下面将执行此操作。您需要更新 SQL 查询以反映您的架构。

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) 
    die("Connection failed: " . $conn->connect_error);
 

// sql to delete a record
$sql = "DELETE FROM MyGuests WHERE id=3";

if ($conn->query($sql) === TRUE) 
    echo "Record deleted successfully";
 else 
    echo "Error deleting record: " . $conn->error;


$conn->close();
?>

【讨论】:

您的权利,但我想在我的应用程序从 Shopify 商店中删除时应用此代码。【参考方案2】:

您的示例代码正在注册一个回调,该回调将由 shopify 卸载 webhook 访问,该回调将在您通过 shopify 管理 UI 卸载您的应用时运行。确保“地址”属性是应用程序卸载回调的公共 URL。

是的,您可以随时为 webhook 注册回调。

卸载应用后,shopify 将向您在“地址”属性中指定的地址发送一个 POST 请求,其中包含客户详细信息的 json payload。

在您的回调删除客户数据之前,请注意收集 X-Shopify-Hmac-SHA256 标头并验证这是一个真实请求。

Make sure you have all the data you need before the uninstall hook is run. 卸载会撤销帐户令牌,从 shopify 中删除已注册的 webhook 和应用数据。

【讨论】:

但是当应用程序从商店中删除时,卸载的钩子不会运行我的 URL 'address'=>' mydomainname/uninstalled.php', 您是否验证了网络挂钩已配置?您可以使用GET /admin/webhooks.json 是的,我验证了当应用程序安装时我已经创建了这个钩子,当应用程序删除时,钩子被删除但我的代码没有运行,它们在uninstalled.php 文件中 只是为了验证;您没有在地址中使用“ mydomainname”。 Shopify 不会扩展它。它不是液体模板。让 shopify 支持人员查看日志并查看他们从您的卸载端点获得的响应代码。 好的,所以我们不能直接将回调 url 添加到这个 webhook 对吗?【参考方案3】:

我已实现此代码以订阅 Webhook 到 Shopify 应用的卸载事件。我在 PHP 中创建了一个自定义 shopify 应用程序。所以这里是一步一步的解释:

    将此代码添加到您要创建 webhook 的位置。就我而言,我将其添加到 generate_token.php 文件中。
    /* subscribe to app uninstall webhook */
        $webhook_array = array(
            'webhook' => array(
                'topic' => 'app/uninstalled', 
                'address' => 'https://yourwebsite.com/webhooks/delete.php?shop=' . $shop_url,
                'format' => 'json'
            )
        );
        
        $webhook = shopify_call($access_token, $shop_url, "/admin/api/2021-10/webhooks.json", $webhook_array, 'POST');
        $webhook = json_decode($webhook['response'], JSON_PRETTY_PRINT);
      
        /** subscribe to app uninstall webhook **/
    要测试是否创建了 webhook,您可以运行以下代码。就我而言,我将此代码添加到应用程序的 index.php 文件中以检查响应:
$webhook = shopify_call($token, $shop, "/admin/api/2019-10/webhooks.json", array(), 'GET');
$webhook = json_decode($webhook['response'], JSON_PRETTY_PRINT);

echo print_r( $webhook );
    在“webhook”文件夹下创建delete.php文件(因为我们已经指定文件-https://yourwebsite.com/webhooks/delete.php来执行删除)并使用MySQL函数从数据库中删除存储数据。
    <?php
    require_once("../inc/mysql_connect.php");
    require_once("../inc/functions.php");

    define('SHOPIFY_APP_SECRET', 'xxxxxxxxxxxxxxxxxxxxxxx'); // Replace with your SECRET KEY

    function verify_webhook($data, $hmac_header)
    
        $calculated_hmac = base64_encode(hash_hmac('sha256', $data, SHOPIFY_APP_SECRET, true));
        return hash_equals($hmac_header, $calculated_hmac);
    

    $res = '';
    $hmac_header = $_SERVER['HTTP_X_SHOPIFY_HMAC_SHA256'];
    $topic_header = $_SERVER['HTTP_X_SHOPIFY_TOPIC'];
    $shop_header = $_SERVER['HTTP_X_SHOPIFY_SHOP_DOMAIN'];
    $data = file_get_contents('php://input');
    $decoded_data = json_decode($data, true);

    $verified = verify_webhook($data, $hmac_header);

    if( $verified == true ) 
        if( $topic_header == 'app/uninstalled' || $topic_header == 'shop/update') 
            if( $topic_header == 'app/uninstalled' ) 

                $sql = "DELETE FROM shops WHERE shop_url='".$shop_header."' LIMIT 1";
                $result = mysqli_query($conn, $sql);

                $response->shop_domain = $decoded_data['shop_domain'];

                $res = $decoded_data['shop_domain'] . ' is successfully deleted from the database';
             
            else 
                $res = $data;
            
        
     else $res = "The request is not from Shopify";

    error_log('Response: '. $res); //check error.log to see the result
?>

【讨论】:

以上是关于从 Shopify 商店卸载应用程序后,从 PHP 应用程序中删除商店详细信息的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Laravel 中的 API 从 Shopify 商店获取所有订单

如何从 Shopify Python API 获取所有产品 ID

如何捕获 Shopify Webhook 发送的 HTTP POST 请求

从Shopify发送获取请求

Shopify Plus 启用 Checkout.liquid

如果用户卸载应用程序然后从商店重新安装,ios 推送通知不起作用?