feat(tenpayv3): 新增微信全数电发票相关接口

This commit is contained in:
Fu Diwei
2025-09-24 20:55:14 +08:00
parent d2c1a8bb55
commit 449d605c98
35 changed files with 1522 additions and 213 deletions

View File

@@ -9,7 +9,11 @@
"bank_name": "测试银行",
"bank_account": "62001234567890",
"phone": "18507550000",
"email": "123110@qq.com"
"email": "123110@qq.com",
"amount": 1000,
"out_trade_no": "order_20200701_123456",
"fapiao_bill_type": "COMM_FAPIAO",
"user_apply_message": "用户留言"
},
"fapiao_card_information": [
{

View File

@@ -0,0 +1,50 @@
{
"sub_mchid": "example_sub_mchid",
"fapiao_apply_id": "example_fapiao_apply_id",
"buyer_information": {
"type": "INDIVIDUAL",
"name": "深圳市南山区测试企业",
"taxpayer_id": "202003261233701778",
"address": "深圳市南山区深南大道10000号",
"telephone": "075512345678",
"bank_name": "测试银行",
"bank_account": "62001234567890",
"phone": "mI7HGEJ4Q2B91IGjHrl7FNN9QuFPDfzeXoaJM4B8ZghZPzXK+vNotEZu/Gthm87Szv0MK2AoC0/3ZMDgltMtdoY6O0qZ4F1iXiwCuqkkBe+9M4ggvdzpPGM+fyed2QU1seUGbii5RVVVB9s+zLEQ8nv74vsgl77MZx14nd5obtCcfAvPfDJob3oG7FqlThmYKJqjiOwBvvQse7p9R8onj/POzSrbM8re8ZYGp4LcehXopTLdk2ZVWRv8bnJgKZWArAcqMdahq4jY2UVYeY4vpMmq4xuRTYk6xNXvowBBKK2SX8SqM+jm1USyoBIazLu4oaNFNdBO3fip1a1rFW0vRw==",
"email": "NzJy3r0Z2u2Vs5l+WSH0A3CZ1oGlCZ66aa2wUlMXNmACbd4wU8LqqYCuTG4cYWxrVUSmviV59/Uy9vLdIwuHZVrMalYAZGtb8inWGhDj3wUqQnPkmBKBVGIWG5Y6XJmMvpXW6rIKsdzxs8NwWj30cRNfjanLxiWc0aIgl8Knwo0JcxlcYLo38T9ntsrRkQZMQEWHaMYnzjp7ysLbp6yW83OZb/NwEufERBdPnIbDbVE7DUd5MGhvO+tlr2YC1b4VCsrDmjryuTD5nvYYCGHyfXW2CM23hZdBm9tPc+mU18Z9d4XkasnfsecGWd2ISkpPmnk3DtapnD64Nw8JyLtkgw==",
"amount": 1000,
"out_trade_no": "order_20200701_123456",
"fapiao_bill_type": "COMM_FAPIAO",
"user_apply_message": "用户留言"
},
"fapiao_information": {
"fapiao_id": "20200701123456",
"total_amount": 382895,
"items": [
{
"tax_code": "3010101020203000000",
"goods_name": "*xxx*服务",
"specification": "米",
"unit": "米",
"quantity": 100000000,
"total_amount": 429900,
"tax_rate": 1300,
"discount": false,
"preferential_policy_code": 1
}
],
"export_business_policy_code": 1,
"vat_refund_levy_code": 1,
"billing_person_id": "128279891283",
"billing_person": "example_billing_person",
"fapiao_bill_type": "COMM_FAPIAO",
"transaction_information": [
{
"pay_channel": "WECHAT_PAY",
"transaction_id": "4200000008202508080512076713",
"out_trade_no": "order_20200701_123456",
"amount": 382895
}
],
"remark": "备注"
}
}

View File

@@ -0,0 +1,62 @@
{
"sub_mchid": "1900000109",
"fapiao_apply_id": "4200000444201910177461284488",
"buyer_information": {
"type": "INDIVIDUAL",
"name": "深圳市南山区测试企业",
"taxpayer_id": "202003261233701778",
"address": "深圳市南山区深南大道10000号",
"telephone": "075512345678",
"bank_name": "测试银行",
"bank_account": "62001234567890",
"phone": "mI7HGEJ4Q2B91IGjHrl7FNN9QuFPDfzeXoaJM4B8ZghZPzXK+vNotEZu/Gthm87Szv0MK2AoC0/3ZMDgltMtdoY6O0qZ4F1iXiwCuqkkBe+9M4ggvdzpPGM+fyed2QU1seUGbii5RVVVB9s+zLEQ8nv74vsgl77MZx14nd5obtCcfAvPfDJob3oG7FqlThmYKJqjiOwBvvQse7p9R8onj/POzSrbM8re8ZYGp4LcehXopTLdk2ZVWRv8bnJgKZWArAcqMdahq4jY2UVYeY4vpMmq4xuRTYk6xNXvowBBKK2SX8SqM+jm1USyoBIazLu4oaNFNdBO3fip1a1rFW0vRw==",
"email": "NzJy3r0Z2u2Vs5l+WSH0A3CZ1oGlCZ66aa2wUlMXNmACbd4wU8LqqYCuTG4cYWxrVUSmviV59/Uy9vLdIwuHZVrMalYAZGtb8inWGhDj3wUqQnPkmBKBVGIWG5Y6XJmMvpXW6rIKsdzxs8NwWj30cRNfjanLxiWc0aIgl8Knwo0JcxlcYLo38T9ntsrRkQZMQEWHaMYnzjp7ysLbp6yW83OZb/NwEufERBdPnIbDbVE7DUd5MGhvO+tlr2YC1b4VCsrDmjryuTD5nvYYCGHyfXW2CM23hZdBm9tPc+mU18Z9d4XkasnfsecGWd2ISkpPmnk3DtapnD64Nw8JyLtkgw==",
"amount": 1000,
"out_trade_no": "order_20200701_123456",
"fapiao_bill_type": "COMM_FAPIAO",
"user_apply_message": "用户留言"
},
"fapiao_information": {
"fapiao_id": "20200701123456",
"total_amount": 382895,
"items": [
{
"tax_code": "3010101020203000000",
"goods_name": "*经营租赁*车辆停放服务",
"specification": "米",
"unit": "METER",
"quantity": 100000000,
"total_amount": 429900,
"tax_rate": 1300,
"discount": false,
"preferential_policy_code": 1,
"real_estate_leasing_information": {
"province": "重庆市",
"city": "涪陵区",
"address": "xx街道xx小区",
"lease_period_start": "2025-01-01T10:00:00+08:00",
"lease_period_end": "2025-07-01T12:00:00+08:00",
"cross_city_flag": true,
"certificate_no": "OVgc/slzCvzSebaz46sUA4tJmm5GbNC0Tkp0oKmuHev9aTDzzcNIy5fKuywKWa0aYIWPyitr3wCYVPUw5Bnw1VUr6jn9eCeQPQye2t+zNuuCM0vmr1NNhdI3a2FNIx5HxkBrdM0XuiLt2/46UaWuzcUbZ52CCtZGgRzxeuj6oF/RKVG+dzT2HOm3kbYi1cUM10hARPKN+kV84I5WnFglX1cPM7s+OHkWvj38xEAfJBJfj3lf0UTRo",
"plate_no": [
"渝A12345"
]
}
}
],
"export_business_policy_code": 1,
"vat_refund_levy_code": 1,
"billing_person_id": "187776276864872",
"billing_person": "张伟",
"fapiao_bill_type": "COMM_FAPIAO",
"transaction_information": [
{
"pay_channel": "WECHAT_PAY",
"transaction_id": "4200000008202508080512076713",
"out_trade_no": "order_20200701_123456",
"amount": 382895
}
],
"remark": "备注"
}
}

View File

@@ -45,7 +45,11 @@
"bank_name": "测试银行",
"bank_account": "62001234567890",
"phone": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPttdY+aQ6zB",
"email": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPttdY+aQ6za"
"email": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPttdY+aQ6za",
"amount": 1000,
"out_trade_no": "order_20200701_123456",
"fapiao_bill_type": "COMM_FAPIAO",
"user_apply_message": "用户留言"
},
"extra_information": {
"payee": "张三",
@@ -68,7 +72,9 @@
"discount": false
}
],
"remark": "备注"
"remark": "备注",
"fapiao_error_code": "BIZ_ERROR",
"fapiao_error_message": "开票失败。授信额度不足,请联系主管税务机关或者登录电子税务局提额/申报。"
}
]
}

View File

@@ -0,0 +1,5 @@
{
"invite_url": "https://wxacurl.cn?xxx=",
"miniprogram_appid": "wxb1170446a4c0a5a2",
"miniprogram_path": "pages/xxxPage"
}

View File

@@ -0,0 +1,17 @@
{
"total_count": 50,
"offset": 10,
"limit": 1,
"mch_invite_result_list": [
{
"sub_mchid": "1999192837",
"mch_invite_status": "MCH_INVITE_SUCC",
"ep_name": "示例(深圳)有限公司",
"tax_id": "9144050071126766XG",
"invite_code": "code_20200101_123",
"operate_time": "2020-07-01T00:00:00",
"invite_failed_code": "UNKNOWN_TAX_INFO",
"invite_failed_reason": "示例失败原因"
}
]
}

View File

@@ -0,0 +1,25 @@
{
"sub_mchid": "1900000109",
"third_mode": {
"status": "ENABLED"
},
"digital_tax_mode": {
"status": "ENABLED",
"billing_person_info": [
{
"id": "187776276864872",
"name": "张伟"
}
],
"access_time": "2020-07-01T12:00:00+08:00",
"expired_time": "2020-07-02T12:00:00+08:00",
"access_fail_reason": "失败原因",
"ability_info": [
{
"type": "BASE_ABILITY",
"status": "AUTHORIZED",
"authorize_fail_reason": "失败原因"
}
]
}
}

View File

@@ -1,5 +1,6 @@
{
"callback_url": "https://pay.weixin.qq.com/callback",
"sub_mch_code": "1900000109",
"show_fapiao_cell": false
"show_fapiao_cell": false,
"support_vat_fapiao": false
}

View File

@@ -1,3 +1,5 @@
{
"callback_url": "https://pay.weixin.qq.com/callback"
"callback_url": "https://pay.weixin.qq.com/callback",
"show_fapiao_cell": false,
"support_vat_fapiao": false
}

View File

@@ -7,5 +7,9 @@
"bank_name": "测试银行",
"bank_account": "62001234567890",
"phone": "18507550000",
"email": "123110@qq.com"
"email": "123110@qq.com",
"amount": 1000,
"out_trade_no": "order_20200701_123456",
"fapiao_bill_type": "COMM_FAPIAO",
"user_apply_message": "用户留言"
}

View File

@@ -1693,6 +1693,59 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
}
}
[Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /new-tax-control-fapiao/fapiaomerchant/getspinviteurl")]
public async Task TestEncryptRequestSensitiveProperty_GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest()
{
static Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest GenerateMockRequestModel()
{
return new Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest()
{
OperateUser = MOCK_PLAIN_STR
};
}
static void AssertMockRequestModel(Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest request, Func<string, string> decryptor)
{
Assert.NotEqual(MOCK_PLAIN_STR, request.OperateUser!);
Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.OperateUser!));
Assert.Equal(MOCK_CERT_SN, request.WechatpaySerialNumber!, ignoreCase: true);
}
if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantRSACertificatePrivateKey))
{
using (var client = CreateMockClientUseRSA(autoEncrypt: false))
{
var request = GenerateMockRequestModel();
client.EncryptRequestSensitiveProperty(request);
AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
}
using (var client = CreateMockClientUseRSA(autoEncrypt: true))
{
var request = GenerateMockRequestModel();
await client.ExecuteGetNewTaxControlFapiaoMerchantServicePartnerInviteUrlAsync(request);
AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
}
}
if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantSM2CertificatePrivateKey))
{
using (var client = CreateMockClientUseSM2(autoEncrypt: false))
{
var request = GenerateMockRequestModel();
client.EncryptRequestSensitiveProperty(request);
AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
}
using (var client = CreateMockClientUseSM2(autoEncrypt: true))
{
var request = GenerateMockRequestModel();
await client.ExecuteGetNewTaxControlFapiaoMerchantServicePartnerInviteUrlAsync(request);
AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
}
}
}
[Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /papay/insurance-sign/contracts/pre-entrust-sign/h5")]
public async Task TestEncryptRequestSensitiveProperty_PresignPAPayInsuranceSignContractEntrustH5Request()
{