C# 商户进件 SDK 使用文档

简介

此 SDK 包含商户开户、商户开户查询、商户入驻、商户入驻查询功能。渠道商可通过此 SDK 快速进件。

下载地址

SDK下载

SDK 版本记录

版本

日期

说明

v1.1.1

2020-07-21

增加新增应用接口

v1.1.0

2020-05-22

修改消息接收 bug

v1.0.3

2020-03-11

增加商户附件上传接口

v1.0.0

2019-12-04

Adapay 初版

版本要求

.Net Framework 4.5

接入准备

  • 商户需提前入驻

  • 通过线下对接人员获取渠道号

接入方法

  • 下载 SDK

下载文件里包含 SDK 和 Demo 两个目录。SDK 目录下为待添加到项目中的文件,Demo 目录下为示例项目,供接入时参考使用。

  • 获取 API Key

API Key 是您在 Adapay 系统中的身份标识,凭此可使用 Adapay 提供的 SDK 以及 API 服务

API Key 获取路径: 「控制台」 ->「商户信息管理」->「证书管理」

  • privateKey(RSA 私钥)

privateKey 为您本地生成的 RSA 私钥, SDK 在与 Adapay 服务端进行接口请求时,会使用此私钥进行加密。

对应的公钥请上传至「控制台」 ->「商户信息管理」->「证书管理」

  • publicKey(RSA 公钥)

publicKey 是 Adapay 为您生成的 RSA 公钥,SDK 在与 Adapay 服务端进行接口请求时 SDK 需要 publicKey 进行解签。

publicKey 可通过 「控制台」 ->「商户信息管理」->「证书管理」进行下载。

  • 添加 SDK 引用

AdapaySDK.dll

AdapayCore.dll

  • 导入第三方依赖库

接入本 SDK 需依赖以下第三方库,参考 libs 文件夹下提供的 dll 文件

M2Mqtt.Net
Newtonsoft.Json
BouncyCastle.Crypto

使用方法

系统初始化

在使用 Adapay 前,请先完成系统初始化设置

  • 调用示例

MerConfig config = new MerConfig();
config.apiKey = "api_live_9c14f264-e390-41df-984d-df15a6952031";
config.privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMQhsygJ2pp4nCiDAXiqnZm6AzKSVAh+C0BgGR6QaeXzt0TdSi9VR0OQ7Qqgm92NREB3ofobXvxxT+wImrDNk6R6lnHPMTuJ/bYpm+sx397rPboRAXpV3kalQmbZ3P7oxtEWOQch0zV5B1bgQnTvxcG3REAsdaUjGs9Xvg0iDS2tAgMBAAECgYAqGFmNdF/4234Yq9V7ApOE1Qmupv1mPTdI/9ckWjaAZkilfSFY+2KqO8bEiygo6xMFCyg2t/0xDVjr/gTFgbn4KRPmYucGG+FzTRLH0nVIqnliG5Ekla6a4gwh9syHfstbOpIvJR4DfldicZ5n7MmcrdEwSmMwXrdinFbIS/P1+QJBAOr6NpFtlxVSGzr6haH5FvBWkAsF7BM0CTAUx6UNHb+RCYYQJbk8g3DLp7/vyio5uiusgCc04gehNHX4laqIdl8CQQDVrckvnYy+NLz+K/RfXEJlqayb0WblrZ1upOdoFyUhu4xqK0BswOh61xjZeS+38R8bOpnYRbLf7eoqb7vGpZ9zAkEAobhdsA99yRW+WgQrzsNxry3Ua1HDHaBVpnrWwNjbHYpDxLn+TJPCXvI7XNU7DX63i/FoLhOucNPZGExjLYBH/wJATHNZQAgGiycjV20yicvgla8XasiJIDP119h4Uu21A1Su8G15J2/9vbWn1mddg1pp3rwgvxhw312oInbHoFMxsQJBAJlyDDu6x05MeZ2nMor8gIokxq2c3+cnm4GYWZgboNgq/BknbIbOMBMoe8dJFj+ji3YNTvi1MSTDdSDqJuN/qS0=";
config.apiMockKey = "api_test_d1a6d63d-3dbf-49ec-ae42-611f80d342db";

//debug 模式开启以后可打印日志
AdapayMerchant.debug = false;

AdapayMerchant.deviceId = "test003";
AdapayMerchant.isMock = false;
//接收异步消息回调通知
AdapayMerchant.msgReceiveHandler += Adapay_msgReceiveHandler;
AdapayMerchant.initWithMerConfig(config);

商户开户进件

商户可通过此接口方法进行商户进件

  • 调用示例

Dictionary<string, object> merchantEntryParams = new Dictionary<string, object>();
merchantEntryParams.Add("request_id", "merchant\_entry\_" + Program.timeStamp());//请求流水号
merchantEntryParams.Add("usr_phone", "13333333357");//注册手机号
merchantEntryParams.Add("cont_name", "测试");
merchantEntryParams.Add("cont_phone", "13333333325");
merchantEntryParams.Add("customer_email", "cuifeile0047@163.com");//邮箱
merchantEntryParams.Add("mer_name", "河南通达电缆股份有限公司a");
merchantEntryParams.Add("mer_short_name", "河南通达公司a");//简称
merchantEntryParams.Add("license_code", "91410300X148288455");
merchantEntryParams.Add("reg_addr", "测试地址666");//注册地址
merchantEntryParams.Add("cust_addr", "测试地址4");
merchantEntryParams.Add("cust_tel", "4006-232-032");
merchantEntryParams.Add("mer_start_valid_date", "20150101");
merchantEntryParams.Add("mer_valid_date", "20251231");
merchantEntryParams.Add("legal_name", "史万福");
merchantEntryParams.Add("legal_type", "0");
merchantEntryParams.Add("legal_idno", "321121198606115128");
merchantEntryParams.Add("legal_mp", "13333333300");
merchantEntryParams.Add("legal_start_cert_id_expires", "20100101");
merchantEntryParams.Add("legal_id_expires", "20301231");
merchantEntryParams.Add("card_id_mask", "6222021703001692228");
merchantEntryParams.Add("bank_code", "01020000");
merchantEntryParams.Add("card_name", "史万福");
merchantEntryParams.Add("bank_acct_type", "2");//1对公、2对私
merchantEntryParams.Add("prov_code", "1100");
merchantEntryParams.Add("area_code", "0011");
merchantEntryParams.Add("rsa_public_key", "dasdasdasdasdasd");//商户RSA公钥

Dictionary<string, object> result = MerchantUser.create(merchantEntryParams);
  • 参数说明

参数说明详见 开户进件

商户开户查询

查询商户开户结果

  • 调用示例

Dictionary<string, object> merchantEntryParams = new Dictionary<string, object>();
merchantEntryParams.Add("request_id", requestId);//请求流水号
Dictionary<string, object> result = MerchantUser.query(merchantEntryParams);
  • 参数说明

参数说明详见 开户查询

商户入驻

渠道商对旗下用户进行商户入驻以及支付渠道批量配置

  • 调用示例

//创建商户入驻的请求参数
Dictionary<string, object> merchantResidentParams = new Dictionary<string, object>();
merchantResidentParams.Add("request_id", "merchant_resident_" + Program.timeStamp());//请求ID
merchantResidentParams.Add("sub_api_key", "api_live_fdcbcc99-4fef-4f23-a8f3-e21d7c7e4f7b");//商户进件后返回的生产或者测试API Key
merchantResidentParams.Add("bank_channel_no", "00000366");//PNRPAY渠道号
merchantResidentParams.Add("fee_type", "01");//费率01-标准费率线上,02-标准费率线下
merchantResidentParams.Add("app_id", "app_8ceee760-c0a4-4313-8795-e180c40391f3");//商户进件后返回的应用ID
merchantResidentParams.Add("wx_category", "270");//微信经营类目,请参考微信经营类目表
merchantResidentParams.Add("alipay_category", "2015091000052157");//支付宝经营类目,请参考支付宝经营类目表
merchantResidentParams.Add("cls_id", "5812");//行业分类,支付宝必填,请参考支付宝经营类目表
merchantResidentParams.Add("model_type", "1");//入驻模式,1-服务商模式
merchantResidentParams.Add("mer_type", "1");//商户种类
merchantResidentParams.Add("province_code", "310000");//省份编码
merchantResidentParams.Add("city_code", "310100");//城市编码
merchantResidentParams.Add("district_code", "310115");//区县编码
//组装配置信息
Dictionary<string, object> configValueParams = new Dictionary<string, object>();

//开通支付宝APP支付,EMPTY_STR代表不需要传额外的参数给我们,传这条数据,代表需要开通该渠道,不传则不开通
configValueParams.Add("alipay_scan", "");
configValueParams.Add("alipay", "");
//开通支付宝H5支付,EMPTY_STR代表不需要传额外的参数给我们,传这条数据,代表需要开通该渠道,不传则不开通
configValueParams.Add("alipay_wap", "");
configValueParams.Add("alipay_qr", "");
configValueParams.Add("alipay_lite", "");
Dictionary<string, object> dict1 = new Dictionary<string, object>();
dict1.Add("appid", "wx121eceb8f398e376");
configValueParams.Add("wx_lite", dict1);
Dictionary<string, object> dict2 = new Dictionary<string, object>();
dict2.Add("appid", "wx86f161d5a32af6ac");
dict2.Add("path", "https://wap-beta.lewaimai.com/lewaimaigod/");
configValueParams.Add("wx_pub", dict1);

merchantResidentParams.Add("add_value_list", JsonConvert.SerializeObject(configValueParams, Formatting.None));

Dictionary<string, object> result = MerchantConfig.config(configValueParams);
  • 参数说明

参数说明详见 商户入驻

商户入驻修改

渠道商对旗下用户进行商户入驻信息修改或升级M3,目前仅支持支付宝渠道的操作,修改结果异步报文通知

  • 调用示例

// 组装配置信息
Dictionary<string, object> configValueParams = new Dictionary<string, object>();

configValueParams.Add("mer_short_name", "天气科技");
configValueParams.Add("mer_phone", "15866666666");
configValueParams.Add("fee_type", "01");
configValueParams.Add("card_no", "6227000734730752277");
configValueParams.Add("card_name", "上海天气科技有限公司");
configValueParams.Add("category", "2015050700000000");
configValueParams.Add("cls_id", "5812");
configValueParams.Add("mer_name", "上海天气科技有限公司");
configValueParams.Add("mer_addr", "上海市浦东新区");
configValueParams.Add("contact_name", "王先生");
configValueParams.Add("contact_phone", "15866666666");
configValueParams.Add("contact_mobile", "15866666666");
configValueParams.Add("contact_email", "wang@163.com");
configValueParams.Add("legal_id_no", "310555555555555555");
configValueParams.Add("mer_license", "110108001111111");
configValueParams.Add("province_code", "310000");
configValueParams.Add("city_code", "310100");
configValueParams.Add("district_code", "310115");
// 创建商户入驻的请求参数
Dictionary<string, object> merchantResidentParams = new Dictionary<string,object>();
merchantResidentParams.Add("request_id", "merchant_resident_" + Program.timeStamp());// 请求ID
merchantResidentParams.Add("sub_api_Key", "api_live_fdcbcc99-4fef-4f23-a8f3-e21d7c7e4f7b");// 商户进件后返回的生产或者测试API Key
merchantResidentParams.Add("alipay_request_params", JsonConvert.SerializeObject(configValueParams, Formatting.None));//商户进件后返回的生产或者测试API Key

Dictionary<string, object> result = MerchantConfig.modify(merchantResidentParams);
  • 参数说明

参数说明详见 商户入驻修改

商户入驻查询

通过 request_id 查询商户入驻结果

  • 调用示例

Dictionary<string, object> queryMerchantEntryParams = new Dictionary<string, object>();
queryMerchantEntryParams.Add("request_id", requestId);
//调用sdk查询商户入驻信息方法,得到商户入驻对象
Dictionary<string, object> result = MerchantConfig.query(queryMerchantEntryParams);
  • 参数说明

参数说明详见 商户入驻查询

上送商户证照

上传商户附件信息

  • 调用示例

Dictionary<string, object> reuestParams = new Dictionary<string, object>();
reuestParams.Add("subApiKey", "api_live_fdcbcc99-4fef-4f23-a8f3-e21d7c7e4f7b");
reuestParams.Add("fileType", "02");
Dictionary<string, object> result = MerchantConfig.uploadProfilePic("test.png", reuestParams);
  • 参数说明

参数说明详见 上送商户证照

提交商户证照信息

商户证件信息提交接口,调用后提交后商户证件信息审核状态切换为“等待后台审核“

  • 调用示例

Dictionary<string, object> request = new Dictionary<string, object>();
request.Add("subApiKey", "api_live_fdcbcc99-4fef-4f23-a8f3-e21d7c7e4f7b");//请求ID
request.Add("socialCreditCodeId", "0067363309554112");//请求ID

request.Add("legalCertIdFrontId", "0067363504549376");//请求ID
request.Add("legalCertIdBackId", "0067363574467008");//请求ID
request.Add("businessAdd", "http://www.baidu.com");//请求ID
request.Add("storeId", "0067361944316352|0067363749735936");
request.Add("accountOpeningPermitId", "0067364019530176");//请求ID
//调用sdk查询商户入驻信息方法,得到商户入驻对象
Dictionary<string, object> result = MerchantConfig.auditProfileInfo(request);
  • 参数说明

参数说明详见 提交商户证照信息

查询商户审核状态

商户可以查看提交的商户基础信息审核状态

  • 调用示例

Dictionary<string, object> request = new Dictionary<string, object>();
request.Add("subApiKey", "api_live_fdcbcc99-4fef-4f23-a8f3-e21d7c7e4f7b");
Dictionary<string, object> result = MerchantConfig.queryAuditProfile(request);
  • 参数说明

参数说明详见 商户审核状态查询

创建应用

代理商帮商户创建应用

  • 调用示例

Dictionary<string, object> request = new Dictionary<string, object>();
request.Add("sub_api_key", "api_live_fdcbcc99-4fef-4f23-a8f3-e21d7c7e4f7b");
request.Add("app_name", "api_live_fdcbcc99-4fef-4f23-a8f3-e21d7c7e4f7b");
Dictionary<string, object> result = MerchantConfig.createApp(request);
  • 参数说明

参数说明详见 创建应用

查询应用

代理商查询商户应用列表

  • 调用示例

Dictionary<string, object> request = new Dictionary<string, object>();
request.Add("sub_api_key", "api_live_fdcbcc99-4fef-4f23-a8f3-e21d7c7e4f7b");//请求ID
Dictionary<string, object> result = MerchantConfig.queryApp(request);
  • 参数说明

参数说明详见 查询应用

附件