unionid 机制
在拥有多个智能小程序的主体的情况下,智能小程序提供的 unionid ,使开发者可以实现跨小程序的用户区分。从用户角度看,每个用户在同一主体下的小程序内 unionid 是唯一的。unionid 获取依赖用户登录授权,请妥善处理用户未授权场景。
getunionid
接口说明
获取 unionid 。
Web 态说明:Web 态尚未支持。
接口地址
https://openapi.baidu.com/rest/2.0/smartapp/getunionid?access_token=${access_token}
方法参数
Header 参数
参数名 | 类型 | 是否必须 | 描述 |
---|---|---|---|
Content-Type | Application/x-www-form-urlencoded | 是 | HTTP 的实体首部字段,浏览器原生 form 表单 |
query 参数
参数名 | 类型 | 是否必须 | 描述 |
---|---|---|---|
access_token | String | 是 | 接口调用凭证 |
post 参数
参数名 | 类型 | 是否必须 | 描述 |
---|---|---|---|
openid | String | 是 | 用户 openid ,需要经过用户登录授权过程获取 |
返回值说明
参数名 | 类型 | 描述 |
---|---|---|
errno | Int | 错误码,详情见下方错误码 |
errmsg | String | 错误信息 |
request_id | String | 请求 ID ,标识一次请求 |
data | Object | 详细数据,errno 为 0 的情况下才有意义 |
data 字段描述
参数名 | 类型 | 描述 |
---|---|---|
unionid | String | 小程序用户 + 开发者主体维度唯一的 id |
返回值示例
{
"data": {
"unionid": "St6PVMkgMDeh92Uq2EWfx6H"
},
"errmsg": "succ",
"errno": 0,
"request_id": "2321772211",
"timestamp": 1563886782
}
错误码
错误码 | 描述 |
---|---|
0 | 正常 |
400 | 参数错误,请检查 openid 是否传递正确 |
10010500 | 服务端内部异常,请稍候重试 |
代码示例
- PHP
- GO
<?php
/**
* php curl方式获取unionid
*/
// 参考 accessToken 获取文档
$accessToken = "xxx";
// 用户openid
$openid = "xxxx";
$ret = getUnionid($accessToken, $openid);
var_dump($ret);
/**
* @desc 发起获取unionid请求
*/
function getUnionid($accessToken, $openid){
$url = "https://openapi.baidu.com/rest/2.0/smartapp/getunionid?access_token={$accessToken}";
$postDataArr = array(
'openid' => $openid,
);
$resp = curlPost($url, $postDataArr);
return $resp;
}
/**
* @desc curl POST请求,可以按照自己实际编程环境替换
* @param string $url 请求的url地址
* @param array $postDataArr 传递的数组参数
* @return string 检测结果json字符串
*/
function curlPost($url, $postDataArr){
$headerArr =array("Content-type:application/x-www-form-urlencoded");
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postDataArr);
curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArr);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
/**
* Go http PostForm 方式获取unionid
*/
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
"time"
)
// 返回的信息
type Response struct {
Errno int `json:"errno"`
Errmsg string `json:"errmsg"`
RequestId string `json:"request_id"`
Timestamp int64 `json:"timestamp"`
Data struct {
Unionid string `json:"unionid"`
} `json:"data"`
}
func main() {
// 参考 accessToken 获取文档
accessToken := "xxx"
// 用户openid
openid := "xxx"
resp, err := getUnionid(accessToken, openid)
fmt.Println(resp, err)
}
/**
* getUnionid 发起getUnionid请求
*/
func getUnionid(accessToken, openid string) (*Response, error) {
urlPath := "https://openapi.baidu.com/rest/2.0/smartapp/getunionid?access_token=" + accessToken
data := make(url.Values)
data.Add("openid", openid)
resp, err := netPost(urlPath, &data)
if err != nil {
log.Println(err)
return nil, err
}
return resp, nil
}
/**
* netPost POST请求,可以按照自己实际编程环境替换
*/
func netPost(urlPath string, data *url.Values) (*Response, error) {
req, err := http.NewRequest(http.MethodPost, urlPath, strings.NewReader(data.Encode()))
req.Header.Add("content-type", "application/x-www-form-urlencoded")
if err != nil {
log.Println(err)
return nil, err
}
client := &http.Client{Timeout: 5 * time.Second}
resp, err := client.Do(req)
if err != nil || resp.Body == nil {
log.Println(err)
return nil, err
}
defer resp.Body.Close()
result, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println(err)
return nil, err
}
respData := &Response{}
err = json.Unmarshal(result, respData)
if err != nil {
log.Println(err)
return nil, err
}
return respData, nil
}