实习日志2(活字格调用服务端向百度ai发接口请求)

试了一下前端获取token,失败,报错:

Access to XMLHttpRequest at 'https://aip.baidubce.com/oauth/2.0/token' from origin 'http://localhost:44203' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

问题描述:

遇到的错误消息与跨域资源共享(CORS)有关。CORS是由Web浏览器实施的安全功能,用于限制网页对不同于提供网页的域的请求。

在情况下,从http://localhost:44203https://aip.baidubce.com/oauth/2.0/token发出请求,而https://aip.baidubce.com上的服务器未配置为允许来自本地域的请求。

解决办法:

在本地机器上设置代理服务器,将请求转发到https://aip.baidubce.com。这样,你的请求将来自与页面相同的域,就不会遇到CORS问题。

报错的代码
// 获取当前页面上名称为account的单元格
// 获取当前页面
var page = Forguncy.Page;
var AppID = page.getCell("AppID").getValue();
var APIKey = page.getCell("APIKey").getValue();
var SecretKey = page.getCell("SecretKey").getValue();
var AESKey = page.getCell("AESKey").getValue();
var access_tokenCell = page.getCell("access_token");

// 请求地址
const url = `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${APIKey}&client_secret=${SecretKey}`;

// 创建XHR对象
const xhr = new XMLHttpRequest();

// 设置请求方法和URL
xhr.open('POST', url, true);

// 设置请求头
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('Accept', 'application/json');

// 处理响应
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            // 处理响应数据
            const responseData = xhr.responseText;
            alert("响应数据: " + responseData);
            console.log('responseData: ' + responseData)
            // 将JSON字符串解析为JavaScript对象
            const responseObject = JSON.parse(responseData);
            console.log('responseObject: ' + responseObject)
            // 获取data值
            const data = responseObject.data;
            console.log('data: ' + data)
            access_tokenCell.setValue(data.access_token);
            // //获取页面上的表格
            // var listview = page.getListView("表格1");
            // //添加新行
            // listview.addNewRow(jsonDataObject);
        } else {
            // 处理错误
            console.error('Error:', xhr.status, xhr.statusText);
            alert("Error" + xhr.status + "  " + xhr.statusText);
        }
    }
};

// 发送请求
xhr.send(JSON.stringify(""));

修改后的代码:

// 获取当前页面上名称为account的单元格
// 获取当前页面
var page = Forguncy.Page;
var access_token = page.getCell("access_token").getValue();
var imageUrl = page.getCell("imageUrl").getValue();
var result=page.getCell("result");
//获取单元格的值
var data = {
    //传入请求地址
    token: access_token,
    imageUrl: imageUrl
};
Forguncy.Helper.post("customapi/fapiaoapi/vatInvoice", data, function (res) {
    console.log("res:"+res);
    let jsonData=JSON.parse(res);
    console.log(jsonData.words_result);
    jsonData=JSON.stringify(jsonData.words_result);
    console.log(jsonData);
    result.setValue(res);
});
其中调用的C#类库代码:
using GrapeCity.Forguncy.ServerApi;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using RestSharp;
using System.Net;
using System.Web;

namespace FaPiaoApi
{
    public class FaPiaoApi : ForguncyApi
    {
        [Post]
        public async Task GetTokenApi()
        {
            //获取post请求的数据
            var form = await Context.Request.ReadFormAsync();
            var url = form["url"][0];

            var client = new RestClient(url);
            client.Timeout = -1;
            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-Type", "application/json");
            request.AddHeader("Accept", "application/json");
            var body = @"";
            request.AddParameter("application/json", body, ParameterType.RequestBody);
            IRestResponse response = client.Execute(request);
            Console.WriteLine(response.Content);
            //响应数据
            await this.Context.Response.WriteAsync(response.Content);

        }
        [Post]
        public async Task VatInvoice()
        {
            //获取post请求的数据
            var form = await Context.Request.ReadFormAsync();
            var token = form["token"][0];
            var imageUrl = form["imageUrl"][0];
            var client = new RestClient("https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice?access_token=" + token);
            client.Timeout = -1;
            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
            request.AddHeader("Accept", "application/json");
            request.AddParameter("url", imageUrl);
            request.AddParameter("seal_tag", "false");
            IRestResponse response = client.Execute(request);
            Console.WriteLine(response.Content);
            //响应数据
            await this.Context.Response.WriteAsync(response.Content);
        }
    }
}
返回的信息普通发票没有check_code校验码,我蚌埠住了,验真功能好像做不出来了qwq

实习日志2(活字格调用服务端向百度ai发接口请求)_第1张图片

先提取发票验真需要的参数,并做一些参数类型转换
// 获取当前页面上名称为account的单元格
// 获取当前页面
var page = Forguncy.Page;
var access_token = page.getCell("access_token").getValue();
var imageUrl = page.getCell("imageUrl").getValue();
var resultCell = page.getCell("result");
var invoiceCodeCell = page.getCell("invoice_code");
var invoiceNumCell = page.getCell("invoice_num");
var invoiceDateCell = page.getCell("invoice_date");
var invoiceTypeCell = page.getCell("invoice_type");
var checkCodeCell = page.getCell("check_code");
var totalAmountCell = page.getCell("total_amount");

//获取单元格的值
var data = {
    //传入请求地址
    token: access_token,
    imageUrl: imageUrl
};
Forguncy.Helper.post("customapi/fapiaoapi/vatInvoice", data, function (res) {
    console.log("res:" + res);
    let jsonData = JSON.parse(res);
    jsonData = jsonData.words_result;
    console.log(jsonData);
    invoiceCodeCell.setValue(jsonData.InvoiceCode);
    invoiceNumCell.setValue(jsonData.InvoiceNum);
    invoiceDateCell.setValue(convertDateFormat(jsonData.InvoiceDate));
    invoiceTypeCell.setValue(translateInvoiceType(jsonData.InvoiceType));
    checkCodeCell.setValue(jsonData.CheckCode);
    totalAmountCell.setValue(jsonData.TotalAmount);
    resultCell.setValue(JSON.stringify(jsonData));
    
});


//日期格式转换
function convertDateFormat(inputDateString) {
    // 使用正则表达式提取数字
    var numbersArray = inputDateString.match(/\d+/g);
    // 将数字字符串拼接在一起
    var outputDateString = numbersArray.join("");
    return outputDateString;
}

//发票种类格式转换
function translateInvoiceType(chineseInvoiceType) {
    var translationMap = {
        "增值税专用发票": "special_vat_invoice",
        "增值税电子专用发票": "elec_special_vat_invoice",
        "增值税普通发票": "normal_invoice",
        "增值税普通发票(电子)": "elec_normal_invoice",
        "电子发票(普通发票)": "elec_normal_invoice",
        "增值税普通发票(卷式)": "roll_normal_invoice",
        "通行费增值税电子普通发票": "toll_elec_normal_invoice",
        "区块链电子发票(目前仅支持深圳地区)": "blockchain_invoice",
        "全电发票(专用发票)": "elec_invoice_special",
        "全电发票(普通发票)": "elec_invoice_normal",
        "货运运输业增值税专用发票": "special_freight_transport_invoice",
        "机动车销售发票": "motor_vehicle_invoice",
        "二手车销售发票": "used_vehicle_invoice"
    };

    // 检查输入的中文发票类型是否在映射中,如果是则返回对应的英文翻译,否则返回原始值
    for (var chineseType in translationMap) {
        if (chineseInvoiceType.includes(chineseType)) {
            return translationMap[chineseType];
        }
    }

    // 如果未找到匹配的中文发票类型,则返回空值
    return "";
}
然后验真的C#请求百度ai代码
using GrapeCity.Forguncy.ServerApi;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using RestSharp;
using System.Net;
using System.Web;

namespace FaPiaoApi
{
    public class FaPiaoApi : ForguncyApi
    {
        [Post]
        public async Task GetTokenApi()
        {
            //获取post请求的数据
            var form = await Context.Request.ReadFormAsync();
            var url = form["url"][0];

            var client = new RestClient(url);
            client.Timeout = -1;
            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-Type", "application/json");
            request.AddHeader("Accept", "application/json");
            var body = @"";
            request.AddParameter("application/json", body, ParameterType.RequestBody);
            IRestResponse response = client.Execute(request);
            Console.WriteLine(response.Content);
            //响应数据
            await this.Context.Response.WriteAsync(response.Content);

        }
        [Post]
        public async Task VatInvoice()
        {
            //获取post请求的数据
            var form = await Context.Request.ReadFormAsync();
            var token = form["token"][0];
            var imageUrl = form["imageUrl"][0];
            var client = new RestClient("https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice?access_token=" + token);
            client.Timeout = -1;
            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
            request.AddHeader("Accept", "application/json");
            request.AddParameter("url", imageUrl);
            request.AddParameter("seal_tag", "false");
            IRestResponse response = client.Execute(request);
            Console.WriteLine(response.Content);
            //响应数据
            await this.Context.Response.WriteAsync(response.Content);
        }
        [Post]
        public async Task VatInvoiceVerification()
        {
            //获取post请求的数据
            var form = await Context.Request.ReadFormAsync();
            var token = form["token"][0];
            var invoice_code = form["invoice_code"][0];
            var invoice_num = form["invoice_num"][0];
            var invoice_date = form["invoice_date"][0];
            var invoice_type = form["invoice_type"][0];
            var check_code = form["check_code"][0];
            var total_amount = form["total_amount"][0];

            var client = new RestClient("https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice_verification?access_token=" + token);
            client.Timeout = -1;
            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
            request.AddHeader("Accept", "application/json");
            request.AddParameter("invoice_code", invoice_code);
            request.AddParameter("invoice_num", invoice_num);
            request.AddParameter("invoice_date", invoice_date);
            request.AddParameter("invoice_type", invoice_type);
            request.AddParameter("check_code", check_code);
            request.AddParameter("total_amount", total_amount);
            IRestResponse response = client.Execute(request);
            Console.WriteLine(response.Content);
            //响应数据
            await this.Context.Response.WriteAsync(response.Content);
        }
    }
}
发票验真的前端js代码
// 获取当前页面上名称为account的单元格
// 获取当前页面
var page = Forguncy.Page;
var access_token = page.getCell("access_token").getValue();
var invoiceCode = page.getCell("invoice_code").getValue();
var invoiceNum = page.getCell("invoice_num").getValue();
var invoiceDate = page.getCell("invoice_date").getValue();
var invoiceType = page.getCell("invoice_type").getValue();
var checkCode = page.getCell("check_code").getValue();
var totalAmount = page.getCell("total_amount").getValue();
var verifyMessageCell= page.getCell("verifyMessage");
//获取单元格的值
var data = {
    //传入请求地址
    token: access_token,
    invoice_code: invoiceCode,
    invoice_num: invoiceNum,
    invoice_date: invoiceDate,
    invoice_type: invoiceType,
    check_code: checkCode,
    total_amount: totalAmount,
};
console.log("check_code:"+checkCode);
if(checkCode==""){
alert("check_code未检测到,无法验真");
}else{
Forguncy.Helper.post("customapi/fapiaoapi/vatinvoiceverification", data, function (res) {
    console.log("res:" + res);
    let jsonData = JSON.parse(res);
    console.log(jsonData);
    verifyMessageCell.setValue(jsonData.VerifyMessage);
});
}

添加验真提示防止资源浪费 

实习日志2(活字格调用服务端向百度ai发接口请求)_第2张图片

 验真返回结果 实习日志2(活字格调用服务端向百度ai发接口请求)_第3张图片

BUG记录:

调用的接口:

1.增值税发票识别(bug:识别不出校验码)

2.增值税发票验真(bug:验真结果与实际情况不符)

问题:

验真功能调用后识别结果为不一致,我感觉是识别功能没把校验码识别出来导致的

试了很多次,校验码识别不出

实习日志2(活字格调用服务端向百度ai发接口请求)_第4张图片

这是我用来测试的增值税发票,这是发票在服务器minio中的url:http://47.109.133.206:9000/fapiao/fapiao.png

可以直接通过url访问这个图片

你可能感兴趣的:(百度)