3.开发您的应用程序服务.md 6.21 KB

3. 开发您的应用程序服务

按照上述流程输入相关信息后,在进行测试和提交审核之前,您需要开发您的应用程序服务。它通过一系列API与Shoplazza进行交互。

获取Shoplazza API授权

概述

公共应用使用OAuth 2.0进行授权,交互过程如下图所示。

您需要注意第2、3、4、7、8、9步,然后您需要在第3、4、9步中编写您的处理逻辑代码。

⚠️ 警告: authorization_code只能使用一次。

重要步骤详细信息

第2步:Shoplazza后端通过APP URL建立通信和授权

商家从APP Store添加应用后,Shoplazza服务将通过合作伙伴中心配置的APP URL发送请求。

例如:

https://stamped-review.apps.shoplazza.com/api/auth?hmac=c4caf9b08bdeff7531bb12712ffea860264ec24f5fd953832505c5024d19edca&install_from=app_store&shop=rwerwre.myshoplaza.com&store_id=1339409

格式为:

app_url?hmac=${hmac}&install_from=app_store&shop=${store_domain_name}&store_id=${store_id}

第3步:APP服务进行安全检查

在继续之前,请确保您的应用执行以下安全检查。如果任何检查失败,那么您的应用必须拒绝请求并返回错误,且不得继续执行。

  • hmac是有效的,并且由Shoplazza签名
  • shop参数是有效的商店主机名,以myshoplaza.com结尾

对于安全检查,SHOPLAZZA OAuth SDKs也有相应的方法。您可以通过SHOPLAZZA OAuth SDKs快速验证hmac和shop参数。

使用OAuth-SDK-Go的示例:

import (
  co "github.com/shoplazza-os/oauth-sdk-go"
  "github.com/shoplazza-os/oauth-sdk-go/shoplazza"
)

oauth := &co.Config{
                ClientID:     "s1Ip1WxpoEAHtPPzGiP2rK2Az-P07Nie7V97hRKigl4",
                ClientSecret: "0LFJcNqVb2Z1nVt9xT72vOo0sTWd6j8wVX60Y5xdzZZ",
                Endpoint:     shoplazza.Endpoint,
                RedirectURI:  "https://3830-43-230-206-233.ngrok.io/oauth_sdk/redirect_uri/",
                Scopes:       []string{"read_shop"},
        }
oauth.ValidShop("xxx.myshoplaza.com")        // 验证shop参数

var requestUrl = "http://example.com/some/redirect_uri?code={authorization_code}&shop={store_name}.myshoplaza.com&hmac={hmac}"
query := strings.Split(requestUrl, "?")
params, _ := url.ParseQuery(query[1])
oauth.SignatureValid(params)                 // 验证hmac

HMac验证详情

Shoplazza到您的应用服务器的每个请求或重定向都包含一个hmac参数,可用于验证Shoplazza的真实性。对于每个请求,您必须从查询字符串中删除hmac条目,并通过HMAC-SHA256哈希函数处理它。

例如,对于以下请求:

http://example.com/some/redirect/uri?code=1vtke5ljOOL2jPds6gM0TNCeYZDitYB&shop=simon.myshoplaza.com&hmac=22bad22eee1f92836f7773e87d973479

要删除hmac,您可以将查询字符串转换为map,删除hmac键值对,然后按字典顺序将您的map重新连接为查询字符串。这保留了示例查询字符串中的剩余参数:

code=1vtke5ljOOL2jPds6gM0TNCeYZDitYB&shop=simon.myshoplaza.com
处理哈希函数

删除hmac并重新格式化查询字符串后,您可以使用Client secret作为密钥,通过HMAC-SHA256哈希函数处理该字符串。

第4步:传递Scopes以获得访问所需API的权限

应用程序服务接收此授权请求。如果授权没有问题,它将使用302方法进行重定向。

例如:

https://rwerwre.myshoplaza.com/admin/oauth/authorize?client_id=ZwwR8eXIOq0Rr2XN3zUywxc0q-S9C3w4VkH3HnNUL_Q&redirect_uri=https%3A%2F%2Fstamped-review.apps.shoplazza.com%2Fapi%2Fauth%2Fcallback&response_type=code&scope=read_product+read_order+read_collection+read_shop+read_script_tags+write_script_tags+read_customer+read_price_rules+read_comments

格式:

https://${store_domain_name}/admin/oauth/authorize?client_id={client_id}&scope={scopes}&redirect_uri={redirect_uri}&response_type={response_type}&state={state}

参数:

  • store_domain_name: ${store_name}.myshoplaza.com
  • store_name: 商家商店的名称
  • client_id: 应用的Client ID。您可以在https://partners.shoplazza.com/注册应用后获取
  • scope: [作用域]的空格分隔列表
  • redirect_uri: 商家授权应用后重定向到的URL
  • response_type: OAuth 2.0流程的响应类型,这里我们需要填写code
  • state: 随机值,用于防止CSRF攻击

Scopes

Scope表示公共应用需要请求的权限,不同的权限允许访问不同的API。scope的值由开发者选择并组装到上面提到的302重定向URL中。在商家应用安装确认页面上,将要求商家授权所需的权限。

第7步:通过Code获取Access_token

您可以通过以下请求获取Access token:

POST https://{store_name}.myshoplaza.com/admin/oauth/token

在此请求中,store_name是商家商店的名称,以及以下参数:

  • client_id: 应用的Client ID
  • client_secret: 应用的Client secret密钥
  • code: 重定向中提供的authorization_code
  • grant_type: OAuth 2.0流程的授权类型,请在此处填写authorization_code
  • redirect_uri: 应用的redirect_uri

服务器响应访问令牌:

{
  "token_type": "Bearer",
  "expires_at": 1550546245,
  "access_token": "eyJ0eXAiOiJKV1QiLCJh",
  "refresh_token": "def502003d28ba08a964e",
  "store_id": "2",
  "store_name": "xiong1889"
}

响应参数:

  • token_type: 只会返回Bearer
  • expires_at: access_token过期时间,时间戳格式
  • access_token: 正确的access_token
  • refresh_token: 用于在需要时刷新access_token的刷新令牌
  • store_id: Shoplazza中的商店ID
  • store_name: 商店名称

OAuth SDK可用! 同样,您可以通过SHOPLAZZA OAuth SDKs快速获取访问令牌。

使用OAuth-SDK-Go的示例:

token, err := oauth.Exchange("xxx")
if err != nil {
    // 处理错误
}
fmt.Println(token.AccessToken)

进行API调用

获得访问令牌后,您可以使用它对Shoplazza进行API调用。在API请求的Authorization头部中包含访问令牌:

Authorization: Bearer {access_token}

使用访问令牌访问与您在授权过程中请求的作用域相对应的API。