1 个不稳定版本

0.1.0 2020年12月28日

#7 in #alipay

MIT 许可证

18KB
323 代码行数(不含注释)

alipay-f2f

支付宝当面付API对接,加解密采用RSA2,忽略了部分非必选参数。可以作为对接参考。 具体参考支付宝官方校验规则

Precreate

调用支付宝Precreate接口并校验应答

let biz_content = BizContent::new("16089520029516", "5", "测试商品", 0.2f32);
let req = PreCreateRequest::new(
    "2021002116638987",
    "20201228 14:33:22",
    "http://api.test.alipay.net/atinterface/receive_notify.htm",
    biz_content,
);
//读取自己生成的私钥
let pk = private_key("./app_private_key_pkcs8.pem");
//生成签名
assert!(req.sign(pk).is_ok());
//生成最终的请求报文
let url = format!("https://openapi.alipaydev.com/gateway.do?{}", req);
//使用任意支持Https请求的客户端发送请求
let resp = ureq::post(&url).call();
let resp = resp
    .into_json_deserialize::<PrecreateResponseWrap>()
    .unwrap();
assert_eq!(resp.alipay_trade_precreate_response.msg, "Success");
let pk = public_key("./alipay_public_key.pem");
//通过Alipay提供的公钥验证PrecreateResponse的正确性
assert!(resp.varify(pk).is_ok());

AsyncNotifyCheck

收到来自支付宝的Notify请求后取出query_str后通过支付宝公钥进行校验

let req_query = "total_amount=2.00&buyer_id=2088102116773037&body=大乐透2.1&trade_no=2016071921001003030200089909&refund_fee=0.00&notify_time=2016-07-19 14:10:49&subject=大乐透2.1&sign_type=RSA2&charset=utf-8&notify_type=trade_status_sync&out_trade_no=0719141034-6418&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47&trade_status=TRADE_SUCCESS&version=1.0&sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=&gmt_create=2016-07-19 14:10:44&app_id=2015102700040153&seller_id=2088102119685838&notify_id=4a91b7a78a503640467525113fb7d8bg8e";
let nq = NotifyQuery::from(req_query);
let pk = public_key("./alipay_public_key.pem");
assert!(nq.varify(pk).is_ok());

依赖项

~7.5–10MB
~184K SLoC