从 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 请求