/**
微信公众号/小程序接口二次封装 grpc 内部服务
Base Service 项目的基础服务，实现文件：src/provider/wx.js
项目地址：https://gogs.ywtinfo.com/ywt/base-service.git
*/
syntax = "proto3";

package com.ywt.gapi.base.wechat;
option java_multiple_files = true;
option java_outer_classname = "WechatProto";
option java_package = "com.ywt.gapi.base.wechat";



//根据code拉取用户信息请求
message GetUserInfoByCodeRequest{
	string code = 1;	//换取access_token的票据
	int32 type = 2;		//终端类型
}

//根据code拉取用户信息响应
message GetUserInfoByCodeResponse{
	int32 code = 1;
	string msg = 2;
	string openId = 3;
	string unionId = 4;
	string nickname = 5;
	int32 sex = 6;
	string province = 7;
	string city = 8;
	string country = 9;
	string avatar = 10;
	string language = 11;
	string accessToken = 12;
	int32 expiresIn = 13;
	string refreshToken = 14;
	string privilege = 15;
}

//获取微信access token
message GetAccessTokenRequest{
	int32 type = 1;	//终端类型
    bool forceUpdate = 2;// 请求微信服务器获取 actoken，获取成功后更新到 redis
}

message GetAccessTokenResponse{
	int32 code = 1;
	string token = 2;	//access token
}

//发送公众号模板消息请求
message SendOfficialTplMsgRequest {
    string openid = 1;
    string templateid = 2;
    string url = 3;
    string data = 4;
    int32 terminal = 5;
}

//发送公众号模板消息响应
message SendOfficialTplMsgResponse {
    int32 code = 1;
    string errmsg = 2;
}

//获取公众号图片配置信息请求
message GetWxImageConfigRequest{
    int32 type = 1;
    string url = 2;
}

//获取公众号图片配置信息响应
message GetWxImageConfigResponse{
    int32 code = 1;
    string appId = 2;
    int64 timestamp = 3;
    string nonceStr = 4;
    string signature = 5;
}

//发送订阅事件客服消息请求
message SendSubscribeCustomMsgRequest{
    string openid = 1;
    int32 doctorId = 2;
    string doctorName = 3;
    int32 source = 4;	//关注来源：1-扫码关注   2-其它关注
    int32 terminal = 5;	//公众号类型
}

//发送订阅事件客服消息响应
message SendSubscribeCustomMsgResponse{
    int32 code = 1;
    string msg = 2;
}

//生成临时二维码图片(scene_id)请求
message CreateQrCodeRequest {
    int32 expireSeconds = 1;
    int32 sceneId = 2;
    int32 type = 3; //公众号终端类型值
    string appid = 4;
    string appSecret = 5;
}

//生成临时二维码图片(scene_id)响应
message CreateQrCodeResponse {
    int32 code = 1;
    string info = 2;
    string url = 3;         //二维码图片解析后的地址
    bytes qrData = 4;       //二维码图片二进制数据
    string imgType = 5;     //二维码图片格式
}

//生成临时二维码图片(scene_str)请求
message CreateQrCodeStrSceneRequest {
    int32 expireSeconds = 1;
    string sceneStr = 2;
    int32 type = 3;         //公众号终端类型值
    string appid = 4;
    string appSecret = 5;
}

//生成临时二维码图片(scene_str)响应
message CreateQrCodeStrSceneResponse {
    int32 code = 1;
    string info = 2;
    string url = 3;         //二维码图片解析后的地址
    bytes qrData = 4;       //二维码图片二进制数据
    string imgType = 5;     //二维码图片格式
}

//生成永久二维码图片(scene_id)请求
message CreateQrCodeLimitRequest {
    int32 sceneId = 1;
    int32 type = 2; //公众号终端类型值
    string appid = 3;
    string appSecret = 4;
}

//生成永久二维码图片(scene_id)响应
message CreateQrCodeLimitResponse {
    int32 code = 1;
    string info = 2;
    string url = 3;         //二维码图片解析后的地址
    bytes qrData = 4;       //二维码图片二进制数据
    string imgType = 5;     //二维码图片格式
}

//生成永久二维码图片(scene_str)请求
message CreateQrCodeLimitStrSceneRequest {
    string sceneStr = 1;
    int32 type = 2; //公众号终端类型值
    string appid = 3;
    string appSecret = 4;
}

//生成永久二维码图片(scene_str)响应
message CreateQrCodeLimitStrSceneResponse {
    int32 code = 1;
    string info = 2;
    string url = 3;         //二维码图片解析后的地址
    bytes qrData = 4;       //二维码图片二进制数据
    string imgType = 5;     //二维码图片格式
}

//发送短信请求
message SendSmsRequest {
	string phoneNumbers = 1;	//短信接收号码，多个号码以逗号分隔，批量上限为1000个
	string tplCode = 2;			//短信模板ID
	string tplParam = 3;		//短信模板参数（可选）
	string outId = 4;			//外部流水扩展字段（可选）
}

//发送短信响应
message SendSmsResponse {
	int32 code = 1;
	string requestId = 2;		//请求ID
	string message = 3;			//状态码的描述
	string bizId = 4;			//发送回执ID,可根据该ID查询具体的发送状态
    string statusCode = 5;		//状态码-返回OK代表请求成功,其他错误码详见错误码列表
    string msg = 6;				//异常说明
}

// 通过appid获取微信access token请求
message GetAccessTokenByAppIdRequest {
    string appId = 1;   // appid
    string appSecret = 2; // app secret
}

//发送公众号模板消息请求
message SendOfficialTplMsgByAppIdRequest {
    string openid = 1; // 接受模板消息的用户openId
    string templateid = 2;
    string url = 3;
    string data = 4;
    string miniProgram = 5;
    string appId = 6;// 配置的公众号appId
    string appSecret = 7;// 配置的公众号appSecret
}

//发送公众号模板消息请求
message SendOfficialTemplateMsgByTerminalRequest {
    string openid = 1; // 接受模板消息的用户openId
    string templateid = 2;
    string url = 3;
    string data = 4;
    string miniProgram = 5;
    int32 terminal = 6;
}

//获取OpenId请求, 基于静默授权
message GetOpenIdByCodeRequest{
    string code = 1;    //换取access_token的票据
    int32 type = 2;     //终端类型
}

//获取OpenId响应, 基于静默授权
message GetOpenIdByCodeResponse{
    int32 code = 1;
    string msg = 2;
    string openId = 3;
}

//
message GenQrCode2DataUrlRequest {
    string qrContent = 1;
}
//
message GenQrCode2DataUrlResponse {
    int32 code = 1;
    string dataURL = 2;
}

// 统一发送客服消息请求
message SendCustomMessageRequest {
    string appId = 1;// 配置的公众号appId (此字段废弃--2018/10/20)
    string appSecret = 2;// 配置的公众号appSecret (此字段废弃--2018/10/20)
    string content = 3;// 发送内容参数
    string msgType = 4;// 消息类型
    string openId = 5;//接收用户openId
    int32 terminal = 6; //终端标识
}

// 统一发送客服消息响应
message SendCustomMessageResponse {
    int32 code = 1;
    string msg = 2;
}

//根据内部终端编码获取所对应微信公众平台AppId请求消息
message GetAppIdByInternalTerminalRequest {
    int32 type = 1; //公众号终端类型值 
}

//根据内部终端编码获取所对应微信公众平台AppId响应消息
message GetAppIdByInternalTerminalResponse {
    int32 code = 1;
    string msg = 2;
    string appId = 3;
}

// 根据code获取微信小程序openId,UnionId等信息request
message GetUserInfoByCodeForWxMpRequest {
    string code = 1; //换取access_token的票据
    int32 type = 2; //终端类型
}

// 根据code获取微信小程序openId,UnionId等信息response
message GetUserInfoByCodeForWxMpResponse {
    int32 code = 1;
    string msg = 2;
    string openId = 3;
    string unionId = 4;
}

// 小程序获取解密的敏感数据请求
message GetWxMpDecryptedDataRequest {
    string encryptedData = 1;// 包括敏感数据在内的完整用户信息的加密数据
    string iv = 2;// 加密算法的初始向量
    string openId = 3;// 用户openId
    int32 terminalType = 4;// 终端类型
}

// 小程序获取解密的敏感数据响应
message GetWxMpDecryptedDataResponse {
    int32 code = 1;
    string msg = 2;
    string data = 3;
}

//根据code拉取用户信息请求
message GetUserInfoByOpenIdRequest{
	string openId = 1;	//换取access_token的票据
	int32 terminal = 2;		//终端类型
}

//根据code拉取用户信息响应
message GetUserInfoByOpenIdResponse{
	int32 code = 1;
	string msg = 2;
	string openId = 3;
	string unionId = 4;
	string nickname = 5;
	int32 sex = 6;
	string province = 7;
	string city = 8;
	string country = 9;
	string avatar = 10;
	string language = 11;
	string accessToken = 12;
	int32 expiresIn = 13;
	string refreshToken = 14;
	string privilege = 15;
}
//根据终端类型发送小程序模板消息请求结构体
message SendMPTemplateMsgByTerminalRequest{
    int32 terminal = 1;
    string touser = 2; //接收者（用户）的 openid
    string templateId = 3; //所需下发的模板消息的id
    string page = 4; //点击模板卡片后的跳转页面，仅限本小程序内的页面。支持带参数,（示例index?foo=bar）。该字段不填则模板无跳转
    string formId = 5; //表单提交场景下，为 submit 事件带上的 formId；支付场景下，为本次支付的 prepay_id
    string data = 6; //模板内容，不填则下发空模板
    string emphasisKeyword = 7; //模板需要放大的关键词，不填则默认无放大
}
//根据终端类型发送小程序模板消息响应结构体
message SendMPTemplateMsgByTerminalResponse{
    int32 code = 1;
    string errmsg = 2;
}

//解密微信敏感数据  wx.getUserInfo
message DecryptWxAppDataRequest{
	string code = 1;	//换取access_token的票据
    int32 terminal = 2;		//终端类型
    string encryptedData = 3;
    string iv = 4;
    string openId = 5;
}

//解密微信敏感数据  wx.getUserInfo
message DecryptWxAppDataResponse{
	int32 code = 1;
	string msg = 2;
	string openId = 3;
	string unionId = 4;
	string nickname = 5;
	int32 sex = 6;
	string province = 7;
	string city = 8;
	string country = 9;
	string avatar = 10;
	string language = 11;
	string accessToken = 12;
	int32 expiresIn = 13;
	string refreshToken = 14;
	string privilege = 15;
}
//根据终端类型发送小程序订阅消息请求结构体
message SendMPSubscribeMsgByTerminalRequest{
    int32 terminal = 1;
    string touser = 2; //接收者（用户）的 openid
    string templateId = 3; //所需下发的模板消息的id
    string page = 4; //点击模板卡片后的跳转页面，仅限本小程序内的页面。支持带参数,（示例index?foo=bar）。该字段不填则模板无跳转
    string data = 5; //模板内容，格式形如 { "key1": { "value": any }, "key2": { "value": any } }
}
//根据终端类型发送小程序订阅消息响应结构体
message SendMPSubscribeMsgByTerminalResponse{
    int32 code = 1;
    string errmsg = 2;
}

// 获取网页授权access_token
message GetWxWebAccessTokenRequest{
    string code = 1;    //换取access_token的票据
    int32 terminal = 2;     //终端类型
}

// 获取网页授权access_token
message GetWxWebAccessTokenResponse{
    int32 code = 1;
    string msg = 2;
    string openId = 3;
    string accessToken = 4;
    int32 expiresIn = 5;
    string refreshToken = 6;
    string scope = 7;
}

//基础服务 // 对应 base-service 项目的 wx.js 文件
service WeChatService {
	//根据code拉取用户信息
    rpc getUserInfoByCode(GetUserInfoByCodeRequest) returns (GetUserInfoByCodeResponse);

    //获取微信access token
	rpc getAccessToken(GetAccessTokenRequest) returns (GetAccessTokenResponse);

	//发送公众号模板消息
	rpc sendOfficialTplMsg(SendOfficialTplMsgRequest) returns (SendOfficialTplMsgResponse);

    //获取公众号图片配置信息
    rpc getWxImageConfig(GetWxImageConfigRequest) returns (GetWxImageConfigResponse);

    //发送订阅事件客服消息
    rpc sendSubscribeCustomMsg(SendSubscribeCustomMsgRequest) returns (SendSubscribeCustomMsgResponse);

    //生成临时二维码图片(scene_id)
    rpc createQrCode(CreateQrCodeRequest) returns (CreateQrCodeResponse);

    //生成临时二维码图片(scene_str)
    rpc createQrCodeStrScene(CreateQrCodeStrSceneRequest) returns (CreateQrCodeStrSceneResponse);

    //生成永久二维码图片(scene_id)
    rpc createQrCodeLimit(CreateQrCodeLimitRequest) returns (CreateQrCodeLimitResponse);

    //生成永久二维码图片(scene_str)
    rpc createQrCodeLimitStrScene(CreateQrCodeLimitStrSceneRequest) returns (CreateQrCodeLimitStrSceneResponse);

    //获取OpenId, 基于静默授权
    rpc getOpenIdByCode(GetOpenIdByCodeRequest) returns (GetOpenIdByCodeResponse);

    // 通过appid获取微信access token
    rpc getAccessTokenByAppId(GetAccessTokenByAppIdRequest) returns (GetAccessTokenResponse);

    // 通过appid发送公众号模板消息
    rpc sendOfficialTemplateMsgByAppId(SendOfficialTplMsgByAppIdRequest) returns (SendOfficialTplMsgResponse);

    // 统一发送客服消息
    rpc sendCustomMessage(SendCustomMessageRequest) returns (SendCustomMessageResponse);

    //根据内部终端编码获取所对应微信公众平台AppId
    rpc getAppIdByInternalTerminal(GetAppIdByInternalTerminalRequest) returns (GetAppIdByInternalTerminalResponse);

    // 根据code获取微信小程序openId,UnionId等信息
    rpc getUserInfoByCodeForWxMp(GetUserInfoByCodeForWxMpRequest) returns (GetUserInfoByCodeForWxMpResponse);
    
    // 小程序获取解密的敏感数据
    rpc getWxMpDecryptedData(GetWxMpDecryptedDataRequest) returns (GetWxMpDecryptedDataResponse);

    //根据code拉取用户信息
    rpc getUserInfoByOpenId(GetUserInfoByOpenIdRequest) returns(GetUserInfoByOpenIdResponse);

    // 通过terminal发送公众号模板消息
    rpc sendOfficialTemplateMsgByTerminal(SendOfficialTemplateMsgByTerminalRequest) returns (SendOfficialTplMsgResponse);

    //根据终端类型发送小程序模板消息（旧）
    rpc sendMPTemplateMsgByTerminal(SendMPTemplateMsgByTerminalRequest) returns (SendMPTemplateMsgByTerminalResponse);

    rpc decryptWxAppData(DecryptWxAppDataRequest)returns(DecryptWxAppDataResponse);

    //根据终端类型发送小程序订阅消息（新）
    rpc sendMPSubscribeMsgByTerminal(SendMPSubscribeMsgByTerminalRequest) returns (SendMPSubscribeMsgByTerminalResponse);

    // 获取网页授权access_token
    rpc getWxWebAccessToken(GetWxWebAccessTokenRequest) returns (GetWxWebAccessTokenResponse);
}