Преглед на файлове

增加ocr相关接口 (#388)

Co-authored-by: qiq@pvc123.com <qiq@pvc123.com>
水煮牛肉 преди 5 години
родител
ревизия
d1241790cb
променени са 2 файла, в които са добавени 294 реда и са изтрити 0 реда
  1. 287 0
      officialaccount/ocr/ocr.go
  2. 7 0
      officialaccount/officialaccount.go

+ 287 - 0
officialaccount/ocr/ocr.go

@@ -0,0 +1,287 @@
+package ocr
+
+import (
+	"fmt"
+	"net/url"
+
+	"github.com/silenceper/wechat/v2/officialaccount/context"
+	"github.com/silenceper/wechat/v2/util"
+)
+
+const (
+	ocrIDCardURL         = "https://api.weixin.qq.com/cv/ocr/idcard"
+	ocrBankCardURL       = "https://api.weixin.qq.com/cv/ocr/bankcard"
+	ocrDrivingURL        = "https://api.weixin.qq.com/cv/ocr/driving"
+	ocrDrivingLicenseURL = "https://api.weixin.qq.com/cv/ocr/drivinglicense"
+	ocrBizLicenseURL     = "https://api.weixin.qq.com/cv/ocr/bizlicense"
+	ocrCommonURL         = "https://api.weixin.qq.com/cv/ocr/comm"
+	ocrPlateNumberURL    = "https://api.weixin.qq.com/cv/ocr/platenum"
+)
+
+//OCR struct
+type OCR struct {
+	*context.Context
+}
+
+//coordinate 坐标
+type coordinate struct {
+	X int64 `json:"x,omitempty"`
+	Y int64 `json:"y,omitempty"`
+}
+
+//position 位置
+type position struct {
+	LeftTop     coordinate `json:"left_top"`
+	RightTop    coordinate `json:"right_top"`
+	RightBottom coordinate `json:"right_bottom"`
+	LeftBottom  coordinate `json:"left_bottom"`
+}
+
+//imageSize 图片尺寸
+type imageSize struct {
+	Width  int64 `json:"w,omitempty"`
+	Height int64 `json:"h,omitempty"`
+}
+
+//ResDriving 行驶证返回结果
+type ResDriving struct {
+	util.CommonError
+
+	PlateNumber       string              `json:"plate_num,omitempty"`
+	VehicleType       string              `json:"vehicle_type,omitempty"`
+	Owner             string              `json:"owner,omitempty"`
+	Address           string              `json:"addr,omitempty"`
+	UseCharacter      string              `json:"use_character,omitempty"`
+	Model             string              `json:"model,omitempty"`
+	Vin               string              `json:"vin,omitempty"`
+	EngineNumber      string              `json:"engine_num,omitempty"`
+	RegisterDate      string              `json:"register_date,omitempty"`
+	IssueDate         string              `json:"issue_date,omitempty"`
+	PlateNumberB      string              `json:"plate_num_b,omitempty"`
+	Record            string              `json:"record,omitempty"`
+	PassengersNumber  string              `json:"passengers_num,omitempty"`
+	TotalQuality      string              `json:"total_quality,omitempty"`
+	PrepareQuality    string              `json:"prepare_quality,omitempty"`
+	OverallSize       string              `json:"overall_size,omitempty"`
+	CardPositionFront map[string]position `json:"card_position_front,omitempty"`
+	CardPositionBack  map[string]position `json:"card_position_back,omitempty"`
+	ImageSize         imageSize           `json:"img_size,omitempty"`
+}
+
+//ResIDCard 身份证返回结果
+type ResIDCard struct {
+	util.CommonError
+
+	Type        string `json:"type,omitempty"`
+	Name        string `json:"name,omitempty"`
+	ID          string `json:"id,omitempty"`
+	Address     string `json:"addr,omitempty"`
+	Gender      string `json:"gender,omitempty"`
+	Nationality string `json:"nationality,omitempty"`
+	ValidDate   string `json:"valid_date,omitempty"`
+}
+
+//ResBankCard 银行卡返回结果
+type ResBankCard struct {
+	util.CommonError
+
+	Number string `json:"number,omitempty"`
+}
+
+//ResDrivingLicense 驾驶证返回结果
+type ResDrivingLicense struct {
+	util.CommonError
+
+	IDNumber     string `json:"id_num,omitempty"`
+	Name         string `json:"name,omitempty"`
+	Sex          string `json:"sex,omitempty"`
+	Nationality  string `json:"nationality,omitempty"`
+	Address      string `json:"address,omitempty"`
+	Birthday     string `json:"birth_date,omitempty"`
+	IssueDate    string `json:"issue_date,omitempty"`
+	CarClass     string `json:"car_class,omitempty"`
+	ValidFrom    string `json:"valid_from,omitempty"`
+	ValidTo      string `json:"valid_to,omitempty"`
+	OfficialSeal string `json:"official_seal,omitempty"`
+}
+
+//ResBizLicense 营业执照返回结果
+type ResBizLicense struct {
+	util.CommonError
+
+	RegisterNumber      string              `json:"reg_num,omitempty"`
+	Serial              string              `json:"serial,omitempty"`
+	LegalRepresentative string              `json:"legal_representative,omitempty"`
+	EnterpriseName      string              `json:"enterprise_name,omitempty"`
+	TypeOfOrganization  string              `json:"type_of_organization,omitempty"`
+	Address             string              `json:"address,omitempty"`
+	TypeOfEnterprise    string              `json:"type_of_enterprise,omitempty"`
+	BusinessScope       string              `json:"business_scope,omitempty"`
+	RegisteredCapital   string              `json:"registered_capital,omitempty"`
+	PaidInCapital       string              `json:"paid_in_capital,omitempty"`
+	ValidPeriod         string              `json:"valid_period,omitempty"`
+	RegisterDate        string              `json:"registered_date,omitempty"`
+	CertPosition        map[string]position `json:"cert_position,omitempty"`
+	ImageSize           imageSize           `json:"img_size,omitempty"`
+}
+
+//ResCommon 公共印刷品返回结果
+type ResCommon struct {
+	util.CommonError
+
+	Items     []commonItem `json:"items,omitempty"`
+	ImageSize imageSize    `json:"img_size,omitempty"`
+}
+
+//commonItem 公共元素
+type commonItem struct {
+	Position position `json:"pos"`
+	Text     string   `json:"text"`
+}
+
+//ResPlateNumber 车牌号返回结果
+type ResPlateNumber struct {
+	util.CommonError
+
+	Number string `json:"number"`
+}
+
+//NewOCR 实例
+func NewOCR(c *context.Context) *OCR {
+	ocr := new(OCR)
+	ocr.Context = c
+	return ocr
+}
+
+//IDCard 身份证OCR识别接口
+func (ocr *OCR) IDCard(path string) (ResIDCard ResIDCard, err error) {
+	accessToken, err := ocr.GetAccessToken()
+	if err != nil {
+		return
+	}
+
+	uri := fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrIDCardURL, url.QueryEscape(path), accessToken)
+
+	response, err := util.HTTPPost(uri, "")
+	if err != nil {
+		return
+	}
+
+	err = util.DecodeWithError(response, &ResIDCard, "OCRIDCard")
+
+	return
+}
+
+//BankCard 银行卡OCR识别接口
+func (ocr *OCR) BankCard(path string) (ResBankCard ResBankCard, err error) {
+	accessToken, err := ocr.GetAccessToken()
+	if err != nil {
+		return
+	}
+
+	uri := fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrBankCardURL, url.QueryEscape(path), accessToken)
+
+	response, err := util.HTTPPost(uri, "")
+	if err != nil {
+		return
+	}
+
+	err = util.DecodeWithError(response, &ResBankCard, "OCRBankCard")
+
+	return
+}
+
+//Driving 行驶证OCR识别接口
+func (ocr *OCR) Driving(path string) (ResDriving ResDriving, err error) {
+	accessToken, err := ocr.GetAccessToken()
+	if err != nil {
+		return
+	}
+
+	uri := fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrDrivingURL, url.QueryEscape(path), accessToken)
+
+	response, err := util.HTTPPost(uri, "")
+	if err != nil {
+		return
+	}
+
+	err = util.DecodeWithError(response, &ResDriving, "OCRDriving")
+
+	return
+}
+
+//DrivingLicense 驾驶证OCR识别接口
+func (ocr *OCR) DrivingLicense(path string) (ResDrivingLicense ResDrivingLicense, err error) {
+	accessToken, err := ocr.GetAccessToken()
+	if err != nil {
+		return
+	}
+
+	uri := fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrDrivingLicenseURL, url.QueryEscape(path), accessToken)
+
+	response, err := util.HTTPPost(uri, "")
+	if err != nil {
+		return
+	}
+
+	err = util.DecodeWithError(response, &ResDrivingLicense, "OCRDrivingLicense")
+
+	return
+}
+
+//BizLicense 营业执照OCR识别接口
+func (ocr *OCR) BizLicense(path string) (ResBizLicense ResBizLicense, err error) {
+	accessToken, err := ocr.GetAccessToken()
+	if err != nil {
+		return
+	}
+
+	uri := fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrBizLicenseURL, url.QueryEscape(path), accessToken)
+
+	response, err := util.HTTPPost(uri, "")
+	if err != nil {
+		return
+	}
+
+	err = util.DecodeWithError(response, &ResBizLicense, "OCRBizLicense")
+
+	return
+}
+
+//Common 通用印刷体OCR识别接口
+func (ocr *OCR) Common(path string) (ResCommon ResCommon, err error) {
+	accessToken, err := ocr.GetAccessToken()
+	if err != nil {
+		return
+	}
+
+	uri := fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrCommonURL, url.QueryEscape(path), accessToken)
+
+	response, err := util.HTTPPost(uri, "")
+	if err != nil {
+		return
+	}
+
+	err = util.DecodeWithError(response, &ResCommon, "OCRCommon")
+
+	return
+}
+
+//PlateNumber 车牌OCR识别接口
+func (ocr *OCR) PlateNumber(path string) (ResPlateNumber ResPlateNumber, err error) {
+	accessToken, err := ocr.GetAccessToken()
+	if err != nil {
+		return
+	}
+
+	uri := fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrPlateNumberURL, url.QueryEscape(path), accessToken)
+
+	response, err := util.HTTPPost(uri, "")
+	if err != nil {
+		return
+	}
+
+	err = util.DecodeWithError(response, &ResPlateNumber, "OCRPlateNumber")
+
+	return
+}

+ 7 - 0
officialaccount/officialaccount.go

@@ -3,6 +3,8 @@ package officialaccount
 import (
 	"net/http"
 
+	"github.com/silenceper/wechat/v2/officialaccount/ocr"
+
 	"github.com/silenceper/wechat/v2/officialaccount/datacube"
 
 	"github.com/silenceper/wechat/v2/credential"
@@ -113,3 +115,8 @@ func (officialAccount *OfficialAccount) GetBroadcast() *broadcast.Broadcast {
 func (officialAccount *OfficialAccount) GetDataCube() *datacube.DataCube {
 	return datacube.NewCube(officialAccount.ctx)
 }
+
+//GetOCR OCR接口
+func (officialAccount *OfficialAccount) GetOCR() *ocr.OCR {
+	return ocr.NewOCR(officialAccount.ctx)
+}