lib/wechat/mini_program/url_scheme.ex

defmodule WeChat.MiniProgram.UrlScheme do
  @moduledoc """
  小程序scheme码,适用于短信、邮件、外部网页等拉起小程序的业务场景
  """

  import Jason.Helpers

  @typedoc """
  通过 `scheme` 码进入的小程序页面路径

  必须是已经发布的小程序存在的页面,不可携带 `query`。`path` 为空时会跳转小程序主页。
  """
  @type path :: String.t()
  @typedoc """
  通过 `scheme` 码进入小程序时的 `query`

  最大 `128` 个字符,只支持数字,大小写英文以及部分特殊字符:`!#$&'()*+,/:;=?@-._~`
  """
  @type query :: String.t()
  @typedoc """
  跳转到的目标小程序信息
  """
  @type jump_wxa :: %{path: path, query: query}
  @typedoc """
  到期失效的scheme码的失效时间,为Unix时间戳。

  生成的到期失效scheme码在该时间前有效。最长有效期为1年。生成到期失效的scheme时必填。
  """
  @type expire_time :: non_neg_integer

  @doc """
  生成的小程序码 -
  [官方文档](https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/url-scheme/generateScheme.html){:target="_blank"}

  获取小程序scheme码,适用于短信、邮件、外部网页等拉起小程序的业务场景。
  通过该接口,可以选择生成到期失效和永久有效的小程序码,目前仅针对国内非个人主体的小程序开放,
  详见[获取URL scheme码](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-scheme.html){:target="_blank"}。
  """
  @spec create_scheme(WeChat.client(), jump_wxa, expire_time) :: WeChat.response()
  def create_scheme(client, jump_wxa, expire_time \\ nil) when is_map(jump_wxa) do
    body =
      if is_integer(expire_time) do
        json_map(jump_wxa: jump_wxa, is_expire: true, expire_time: expire_time)
      else
        json_map(jump_wxa: jump_wxa)
      end

    client.post("/wxa/generatescheme", body, query: [access_token: client.get_access_token()])
  end
end