unionid 机制

在拥有多个智能小程序的主体的情况下,智能小程序提供的 unionid ,使开发者可以实现跨小程序的用户区分。从用户角度看,每个用户在同一主体下的小程序内 unionid 是唯一的。unionid 获取依赖用户登录授权,请妥善处理用户未授权场景。

getunionid

接口说明

获取 unionid 。

Web 态说明Web 态尚未支持。

接口地址

  1. https://openapi.baidu.com/rest/2.0/smartapp/getunionid?access_token=${access_token}

方法参数

Header 参数

参数名类型是否必须描述
Content-TypeApplication/x-www-form-urlencodedHTTP 的实体首部字段,浏览器原生 form 表单

query 参数

参数名类型是否必须描述
access_tokenString接口调用凭证

post 参数

参数名类型是否必须描述
openidString用户 openid ,需要经过用户登录授权过程获取

返回值说明

参数名类型描述
errnoInt错误码,详情见下方错误码
errmsgString错误信息
request_idString请求 ID ,标识一次请求
dataObject详细数据,errno 为 0 的情况下才有意义

data 字段描述

参数名类型描述
unionidString小程序用户 + 开发者主体维度唯一的 id

返回值示例

  1. {
  2. "data": {
  3. "unionid": "St6PVMkgMDeh92Uq2EWfx6H"
  4. },
  5. "errmsg": "succ",
  6. "errno": 0,
  7. "request_id": "2321772211",
  8. "timestamp": 1563886782
  9. }

错误码

错误码描述
0正常
400参数错误,请检查 openid 是否传递正确
10010500服务端内部异常,请稍候重试

代码示例

  • PHP
  • GO
  1. <?php
  2. /**
  3. * php curl方式获取unionid
  4. */
  5. // 参考 accessToken 获取文档
  6. $accessToken = "xxx";
  7. // 用户openid
  8. $openid = "xxxx";
  9. $ret = getUnionid($accessToken, $openid);
  10. var_dump($ret);
  11. /**
  12. * @desc 发起获取unionid请求
  13. */
  14. function getUnionid($accessToken, $openid){
  15. $url = "https://openapi.baidu.com/rest/2.0/smartapp/getunionid?access_token={$accessToken}";
  16. $postDataArr = array(
  17. 'openid' => $openid,
  18. );
  19. $resp = curlPost($url, $postDataArr);
  20. return $resp;
  21. }
  22. /**
  23. * @desc curl POST请求,可以按照自己实际编程环境替换
  24. * @param string $url 请求的url地址
  25. * @param array $postDataArr 传递的数组参数
  26. * @return string 检测结果json字符串
  27. */
  28. function curlPost($url, $postDataArr){
  29. $headerArr =array("Content-type:application/x-www-form-urlencoded");
  30. $curl = curl_init();
  31. curl_setopt($curl, CURLOPT_URL, $url);
  32. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  33. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
  34. curl_setopt($curl, CURLOPT_POST, 1);
  35. curl_setopt($curl, CURLOPT_POSTFIELDS, $postDataArr);
  36. curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArr);
  37. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  38. $output = curl_exec($curl);
  39. curl_close($curl);
  40. return $output;
  41. }
  1. /**
  2. * Go http PostForm 方式获取unionid
  3. */
  4. package main
  5. import (
  6. "encoding/json"
  7. "fmt"
  8. "io/ioutil"
  9. "log"
  10. "net/http"
  11. "net/url"
  12. "strings"
  13. "time"
  14. )
  15. // 返回的信息
  16. type Response struct {
  17. Errno int `json:"errno"`
  18. Errmsg string `json:"errmsg"`
  19. RequestId string `json:"request_id"`
  20. Timestamp int64 `json:"timestamp"`
  21. Data struct {
  22. Unionid string `json:"unionid"`
  23. } `json:"data"`
  24. }
  25. func main() {
  26. // 参考 accessToken 获取文档
  27. accessToken := "xxx"
  28. // 用户openid
  29. openid := "xxx"
  30. resp, err := getUnionid(accessToken, openid)
  31. fmt.Println(resp, err)
  32. }
  33. /**
  34. * getUnionid 发起getUnionid请求
  35. */
  36. func getUnionid(accessToken, openid string) (*Response, error) {
  37. urlPath := "https://openapi.baidu.com/rest/2.0/smartapp/getunionid?access_token=" + accessToken
  38. data := make(url.Values)
  39. data.Add("openid", openid)
  40. resp, err := netPost(urlPath, &data)
  41. if err != nil {
  42. log.Println(err)
  43. return nil, err
  44. }
  45. return resp, nil
  46. }
  47. /**
  48. * netPost POST请求,可以按照自己实际编程环境替换
  49. */
  50. func netPost(urlPath string, data *url.Values) (*Response, error) {
  51. req, err := http.NewRequest(http.MethodPost, urlPath, strings.NewReader(data.Encode()))
  52. req.Header.Add("content-type", "application/x-www-form-urlencoded")
  53. if err != nil {
  54. log.Println(err)
  55. return nil, err
  56. }
  57. client := &http.Client{Timeout: 5 * time.Second}
  58. resp, err := client.Do(req)
  59. if err != nil || resp.Body == nil {
  60. log.Println(err)
  61. return nil, err
  62. }
  63. defer resp.Body.Close()
  64. result, err := ioutil.ReadAll(resp.Body)
  65. if err != nil {
  66. log.Println(err)
  67. return nil, err
  68. }
  69. respData := &Response{}
  70. err = json.Unmarshal(result, respData)
  71. if err != nil {
  72. log.Println(err)
  73. return nil, err
  74. }
  75. return respData, nil
  76. }