Quellcode durchsuchen

update:小程序ocr识别 refs#864 (#865)

* update:小程序ocr识别

* fix:删除ResPlateNumber

---------

Co-authored-by: 阴佳帅 <14988374+yin-jiashuai@user.noreply.gitee.com>
yin jiashuai vor 7 Monaten
Ursprung
Commit
54f08cbd73
2 geänderte Dateien mit 254 neuen und 0 gelöschten Zeilen
  1. 6 0
      miniprogram/miniprogram.go
  2. 248 0
      miniprogram/ocr/ocr.go

+ 6 - 0
miniprogram/miniprogram.go

@@ -13,6 +13,7 @@ import (
 	"github.com/silenceper/wechat/v2/miniprogram/express"
 	"github.com/silenceper/wechat/v2/miniprogram/message"
 	"github.com/silenceper/wechat/v2/miniprogram/minidrama"
+	"github.com/silenceper/wechat/v2/miniprogram/ocr"
 	"github.com/silenceper/wechat/v2/miniprogram/operation"
 	"github.com/silenceper/wechat/v2/miniprogram/order"
 	"github.com/silenceper/wechat/v2/miniprogram/privacy"
@@ -191,3 +192,8 @@ func (miniProgram *MiniProgram) GetOperation() *operation.Operation {
 func (miniProgram *MiniProgram) GetExpress() *express.Express {
 	return express.NewExpress(miniProgram.ctx)
 }
+
+// GetOCR OCR接口
+func (miniProgram *MiniProgram) GetOCR() *ocr.OCR {
+	return ocr.NewOCR(miniProgram.ctx)
+}

+ 248 - 0
miniprogram/ocr/ocr.go

@@ -0,0 +1,248 @@
+package ocr
+
+import (
+	"fmt"
+	"net/url"
+
+	"github.com/silenceper/wechat/v2/miniprogram/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"
+)
+
+// 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"`
+}
+
+// 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
+	}
+
+	response, err := util.HTTPPost(fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrIDCardURL, url.QueryEscape(path), accessToken), "")
+	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
+	}
+
+	response, err := util.HTTPPost(fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrBankCardURL, url.QueryEscape(path), accessToken), "")
+	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
+	}
+
+	response, err := util.HTTPPost(fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrDrivingURL, url.QueryEscape(path), accessToken), "")
+	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
+	}
+
+	response, err := util.HTTPPost(fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrDrivingLicenseURL, url.QueryEscape(path), accessToken), "")
+	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
+	}
+
+	response, err := util.HTTPPost(fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrBizLicenseURL, url.QueryEscape(path), accessToken), "")
+	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
+	}
+
+	response, err := util.HTTPPost(fmt.Sprintf("%s?img_url=%s&access_token=%s", ocrCommonURL, url.QueryEscape(path), accessToken), "")
+	if err != nil {
+		return
+	}
+
+	err = util.DecodeWithError(response, &resCommon, "OCRCommon")
+
+	return
+}