SkillAgentSearch skills...

JdPayWebApi

京东支付webapi

Install / Use

/learn @lousaibiao/JdPayWebApi
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

JdPayWebApi

京东支付webapi

Jd支付

包含接口

  • 代付
  • 代付结果查询
  • 快捷签约
  • 快捷支付
  • 代付回调

一些说明

  • 代付接口的token验证
public void OnActionExecuting(ActionExecutingContext context)
{
    //代付的请求做验证
    if (context.HttpContext.Request.Path.Value.ToLower()
            .IndexOf("api/jd/defraypay", StringComparison.CurrentCulture) == -1) return;
    var contains = context.HttpContext.Request.Headers.TryGetValue(TokenKey, out StringValues token);
    if (!contains || token != Token)
    {
        context.Result = new ContentResult()
        {
            StatusCode = 200,
            ContentType = "application/json",
            Content = JsonConvert.SerializeObject(new
            {
                response_code = 999401,
                response_message = "京东支付:非法请求!"
            })
        };
    }
}

如果是代付的地址(api/jd/defraypay),就要验证http请求上做一个验证。Postman截图如下: image

介绍

  1. 项目基于ASPNETCORE 2.0
  • 参照官方的java版本的demo
  • 算签名的时候用了 BouncyCastle,神器。
  • 解析xml用了 YAXLib
  1. 关于配置文件

XXX都可以找jd要

  "JdConfig": {
    "Version": "1.0.0",
    "Merchant": "XXX",//商户号
    "Terminal": "00000001",//终端号
    "DesKey": "XXX",
    "Sha256SignKey": "XXX",//这个也是sha1签名时候的key
    "Md5Key": "XXX",
    "FastPayUrl": "https://quick.chinabank.com.cn/express.htm",
    "DefrayPayUrl": "https://mapi.jdpay.com/npp10/defray_pay",
    "TradeQueryUrl": "https://mapi.jdpay.com/npp10/trade_query",
    "DefrayPayNotifyUrl": "http://serverurl/api/jdcallback/defraypay",//自己的地址
    "ExpressPayNotifyUrl": "http://serverurl/api/jdcallback/expresspay",//自己的地址
    "CustomerNo": "XXX",
    "JdPayAuthToken": "这个是配置的代付的token"
  },
  1. 主要的方法在Site.Common 下面的 JdHelper.cs内
/// <summary>
/// pfx文件密码
/// </summary>
private const string pfxPwd = "XXX";
/// <summary>
/// pfx证书,主要是拿私钥
/// </summary>
public static string PfxPath => Path.Combine(AppContext.BaseDirectory, "rsa", "xxx.pfx");
/// <summary>
/// cer证书,拿公钥
/// </summary>
public static string CertPath => Path.Combine(AppContext.BaseDirectory, "rsa","xxx.cer");
  1. 其他

test 项目就不放上来,太多敏感信息。下面demo里面的一些敏感参数也改成了随机数.

没有引用官方提供的JDAKS.DLL 和 JDSecurity。项目可以直接部署到linux上。

公司项目限定了只用借记卡,所以,这里默认。

/// <summary>
/// 收款卡种 支付工具是TRAN时必填
/// 卡类型 借记卡=DE;信用卡=CR
/// </summary>
/// <returns></returns>
[JsonProperty("payee_card_type")]
public string PayeeCardType => "DE";

代付

  • 地址 post /api/jd/defraypay
  • 参数
{
    "payee_bank_code": "CMB",
    "payee_account_type": "C",
    "category_code": "HZS",
    "payee_account_no": "XXXX",
    "payee_account_name": "某某公司",
    "out_trade_no": "外部单号",
    "trade_amount": "1",
    "payee_bank_fullname": "某某支行",
    "trade_subject": "20180222100318022910",
    "payee_card_type": "DE",
    "payee_mobile": "15505888888",
    "payee_bank_associated_code": "联行号"
}
  • 返回结果
{
    "customer_no": "客户号",
    "out_trade_no": "20180323160300",
    "response_code": "0000",
    "response_datetime": "20180323T160343",
    "response_message": "成功",
    "sign_data": null,
    "sign_type": null,
    "trade_amount": "1",
    "trade_currency": "CNY",
    "trade_no": "2018032320000000000015111",
    "trade_status": "WPAR"
}

代付结果查询

  • 地址 get /api/jd/tradequery
  • 参数 OutTradeNo=JGCHK00043820180323162213
  • 返回
{
    "out_trade_no": "JGCHK00043820180323162213",
    "biz_trade_no": "xxxx",
    "out_trade_date": "Fri Mar 23 15:08:00 CST 2018",
    "trade_class": "DEFY",
    "trade_subject": "code:20180222100318022910",
    "trade_no": "2018032320004200012216605759",
    "seller_info": "{\"customer_type\":\"CUSTOMER_NO\"}",
    "buyer_info": "{\"customer_code\":\"002314032489\",\"customer_type\":\"CUSTOMER_NO\"}",
    "trade_amount": "1",
    "trade_currency": "CNY",
    "refund_amount": null,
    "category_code": "20jd222",
    "confirm_amount": null,
    "trade_respcode": "ACC3030007",
    "trade_respmsg": "账务申请失败:360080004002986837000801:可用余额不足",
    "trade_status": "CLOS",
    "trade_pay_date": "Fri Mar 23 15:08:01 CST 2018",
    "trade_pay_time": null,
    "pay_tool": "TRAN",
    "bank_code": "CMB",
    "card_type": "DE",
    "trade_finish_date": "Fri Mar 23 15:08:01 CST 2018",
    "trade_finish_time": null,
    "return_params": "sfdsf",
    "customer_no": "00000dsf948294",
    "response_datetime": "20180323T171253",
    "sign_type": "SHA-256",
    "sign_data": "153485B335F5B14574A0E205F0C69E6F96E232D8185D86C1EB51C08F93C13875",
    "response_code": "0000",
    "response_message": "成功"
}

快捷签约

  • 地址 post api/jd/ExpressContract
  • 签约之后发短信给用户
  • 参数
{
  "card": {
    "bank": "CCB",
    "no": "666345343254325435",
    "name": "哈喽",
    "idNo": "330998294289348729",
    "phone": "15887670441"
  },
  "trade": {
    "id": "20180321192600",
    "amount": "1"
  }
}
  • 返回
{
    "trade": {
        "type": "V",
        "id": null,
        "amount": null,
        "currency": null
    },
    "return": {
        "code": "EEN0015",
        "desc": "交易已成功,请勿重复支付"
    }
}

快捷支付

  • 地址 post api/jd/fastpay
  • 传收到的验证码
  • 参数
{
  "card": {
    "bank": "CCB",
    "no": "6213201540002345779",
    "name": "哈喽",
    "idNo": "330124199908030789",
    "phone": "1507655441"
  },
  "trade": {
    "id": "20180321192600",
    "amount": "1",
    "code": "762186",
    "notice": "http://www.baidu.com"
  }
}
  • 返回
{
    "trade": {
        "type": "S",
        "id": "20180321192600",
        "amount": "1",
        "currency": "CNY",
        "date": "20180321",
        "time": "204610",
        "note": null,
        "status": "0"
    },
    "return": {
        "code": "EES0035",
        "desc": "短信验证码已过期,请重新获取"
    }
}

代付回调

/// <summary>
/// 代付回调地址
/// </summary>
/// <param name="resp"></param>
/// <returns></returns>
[HttpPost,Route("defraypay")]
public async Task<IActionResult> DefrayPay(DefrayPayCallbackQM qm)
{
    logger.Info($"代付回调返回:{JsonConvert.SerializeObject(qm)}");
    jdService.VerifyDefrayPayCallback(qm);
    //todo 处理代付逻辑
    return Content("ok","text/plain");
}
/// <summary>
/// 快捷回调
/// </summary>
/// <param name="resp"></param>
/// <returns></returns>
[HttpPost,Route("expresspay")]
public async Task<IActionResult> ExpressPay(string resp)
{
    logger.Info($"快捷回调:{resp}");
    await jdService.ParseFastPayAsync(resp);
    //todo 处理快捷逻辑
    return Content("ok","text/plain");
}
View on GitHub
GitHub Stars9
CategoryDevelopment
Updated2mo ago
Forks2

Languages

C#

Security Score

80/100

Audited on Jan 4, 2026

No findings