营业执照识别


Step1: 制作签名

营业执照识别API接口签名方法需遵循“AWS API 2.0 签名规范”。

需要将签名字段按照如下方法进行拼接,并按照指定Hash算法计算后,以base64编码方式进行编码。


签名地址字段


字段 格式要求 说明 可选值
POST\n 大写、以换行\n结束 HTTP请求方法 必选
mosapi.meituan.con\n 小写,以换行\n结束 API服务主机名 必选
/mcs/v1\n\n 小写,以换行\n结束 请求绝对路径 必选

注:将所有签名地址字段拼接成string类型的字符串

例如:

POST\nmosapi.meituan.com\n/mcs/v1\n


签名参数字段


字段 类型 说明 可选值
Action string BusinessLicenseOCR 必选
AWSAccessKeyId string

访问API请求的ACCESS KEY ID

(用户在美团云控制台"API秘钥"可找到该值)

必选
SignatureVersion string 2 必选
Timestamp string 请求时间戳,iso8601格式:YYYY-MM-DDTHH:MM:SS.MMMZ 必选
SignatureMethod string

数字签名的Hash算法,可能的值为"HmacSHA256"和"HmacSHA1",分别对应SHA256和SHA1算法

必选
Format string json 必选

注:所有签名参数按照参数名称的 字典顺序进行排序,并以 x-www-form-urlencoded 编码拼接在一起:

为了保证认证通过请务必对请求参数进行URI编码,参数中的空格务必编码为%20。将空格编码为+会导致认证不通过。

例如:

AWSAccessKeyId=8b5ad48388a347c185b6b7b0ba9e6225&Action=GetBalance&Format=json&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2016-11-14T03%3A10%3A55.000Z


签名内容拼接


将签名地址、签名参数(字典序排序后)以 拼接成string类型的字符串

例如:

POST\nmosapi.meituan.com/mcs/v1\nAWSAccessKeyId=8b5ad48388a347c185b6b7b0ba9e6225&Action=GetBalance&Format=json&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2016-11-14T03%3A10%3A55.000Z

生成签名


用SECRET KEY作为秘钥对拼接后的签名内容以HmacSHA256算法进行Hash加密,并进行base64编码,最终获得签名:

例如:

xOnd5MauvUn8Kx8225Nh7tSYnuIB0oi5H2Jb00UU788=

Step2: 接口调用

接口:https://mosapi.meituan.com/mcs/v1

方法:POST


请求参数


参数名 类型 说明 可选项
Action string BusinessLicenseOCR 必选
AWSAccessKeyId string

访问API请求的ACCESS KEY ID

(用户在美团云控制台"API秘钥"可找到该值)

必选
SignatureVersion string 数字签名算法版本,该值为2 必选
Timestamp string 请求时间戳,iso8601格式:YYYY-MM-DDTHH:MM:SS.MMMZ 必选
SignatureMethod string 数字签名的Hash算法,可能的值为"HmacSHA256"和&"HmacSHA1",分别对应SHA256和SHA1算法 必选
Signature string 请求内容的数字签名,具体签名生成算法见上文的数字签名生成方法 必选
Format string 返回内容的编码格式,值为json 必选
image_content string 营业执照图片,图片的base64编码
  • 建议文件设置为:最小边尺寸大于1200
  • 必选
    注:以上为HTTP请求包body中对应值,需要以 x-www-form-urlencoded 编码拼接在一起后才可进行HTTP请求
    为了保证认证通过请务必对请求参数进行URI编码,参数中的空格务必编码为%20。将空格编码为+会导致认证不通过。


    返回参数


    返回类型:json

    参数名 类型 说明
    biz_type string 公司证照类型:营业执照1/营业执照2/营业执照3
    company_name string 名称/公司名称/纳税人名称
    owner_name string 法定代表人
    company_type string 类型/主体类型/经营形式
    operating_period string 营业期限
    address string 住所/营业场所/经营场所
    scope string 经营范围
    reg_capital string 注册资本
    start_time string 成立日期
    credit_code string 统一社会信用代码
    registration_code string 注册号
    err_code int 错误码
    err_msg string 错误信息

    返回示例:

    
    {
    
      "company_name": "上海商格信息科技有限公司",
    
      "company_type": "有限责任公司国内合资",
    
      "credit_code": "91310000688763988C",
    
      "operating_period": "2009年5月8日至2019年5月7日",
    
      "owner_name": "张巍",
    
      "reg_capital": "人民币687.5000万元整",
    
      "scope": "信息技术、网络技术、射频识别技术、电于莜木的研发,计算朝软件的研发”,
    
      "start_time": "2009年5月8日",
    
      "biz_type": "营业执照3",
    
      "err_code": 0,
    
      "err_msg": "ok"
    
    }
    


    错误码说明


    err_code err_msg 说明
    0 正常返回
    AuthFailed 认证失败
    1002 requests too often 请求太频繁!请稍后重试
    412002000 invalid parameter 参数不正确
    406001000 insufficient account balance 账户余额不足
    406001001 billing request failed 请求计费失败
    415001000 invalid image format 图片格式不正确
    415004000 invalid image format 识别失败
    415002000 image recognition failed 图片太大或太小
    503001000 Service Unavailable 服务不可用


    示例代码

    Python示例代码


    • 示例代码采用Python3版本
    • action字段内容对应Action内容
    • access_key、secret_key对应控制台中的Access Key ID、Access Key Secret
    
    #! /usr/bin/env python3
    #-*- coding:utf-8 -*-
    
    import base64
    import datetime
    import hmac
    import hashlib
    import urllib
    import urllib.parse
    import requests
    import json
    
    access_key = ''  # Access Key ID
    secret_key = ''  # Secret Key
    image = '' #图片路径
    
    action = 'BusinessLicenseOCR'
    url = 'https://mosapi.meituan.com/mcs/v1'
    
    def get_utf8_value(value):
        if not isinstance(value, str): #and not isinstance(value, unicodedata):#(python2版本需要此句)
            value = str(value)
        if isinstance(value, str): #unicode):#(python2版本需要此句)
            return value.encode('utf-8')
        else:
            return value
    
    def sign(params):
        pairs = []
        for key in params.keys():
            val = get_utf8_value(params[key])
            val = urllib.parse.quote(val, safe='-_~')
            pairs.append(urllib.parse.quote(key, safe='') + '=' + val)
        query = '&'.join(sorted(pairs))
        msg = ('POST\nmosapi.meituan.com\n/mcs/v1\n%s' % query)
        content = hmac.new(secret_key.encode('utf-8'), msg.encode('utf-8'), hashlib.sha256).digest()
        ret = base64.b64encode(content).decode()
        return ret
    
    def get_image():
        with open(image,'rb') as image1:
            pic = base64.b64encode(image1.read())
        return pic
    
    def pack_data():
        data = {
            'AWSAccessKeyId':access_key,
            'Action': action,
            'Format': 'json',
            'SignatureMethod': 'HmacSHA256',
            'SignatureVersion': '2',
            'Timestamp': datetime.datetime.now().isoformat()[0:-3]+'Z',
        }
        data.update({'Signature' : sign(data)})
        data.update({'image_content' : get_image()})
        return data
    
    def request():
        data = urllib.parse.urlencode(pack_data())
        headers = {
            'Content-type': 'application/x-www-form-urlencoded',
            'Accept': 'text/plain'
        }
        response = requests.post(
            url = url, data = data, headers = headers, verify = True
        )
        resp_format = json.loads(response.content.decode('utf-8'))
        return resp_format
    
    if __name__ == '__main__':
        print(request())
    

    PHP示例代码


    
    $key_id = '您自己的 key_id';
    $key_secret = '您自己的 key_secret';
    $url = 'https://mosapi.meituan.com/mcs/v1';
    $image_location = '您自己的本地图片路径';
    
    function signature($post_array){
        $string_to_sign = "POST\n";
        $string_to_sign .= "mosapi.meituan.com\n";
        $string_to_sign .= "/mcs/v1\n";
        $string_to_sign .= array2xform($post_array);
        global $key_secret;
        $signature = base64_encode(hash_hmac('sha256', $string_to_sign, $key_secret, true));
        return $signature;
    }
    function array2xform($post_array){
        $string='';
        foreach ($post_array as $k => $v) {
            $string .= "&$k=".rawurlencode($v);
        }
        $string = substr($string, 1);
        return $string;
    }
    $file = fopen($image_location, 'rb');
    $data = fread($file,filesize($image_location));
    fclose($file);
    $image_content = base64_encode($data);
    
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url);
    $post_array = array(
        'AWSAccessKeyId' => $key_id,
        'Action' => 'BusinessLicenseOCR',
        'Format' => 'json',
        'SignatureMethod' => 'HmacSHA256',
        'SignatureVersion' => 2,
        'Timestamp' => date('Y-m-d\TH:i:s.0000\Z', time())
    );
    $post_array['Signature'] = signature($post_array);
    $post_array['image_content'] = $image_content;
    $post_string = array2xform($post_array);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $out = curl_exec($ch);
    curl_close($ch);
    echo $out;