Skip to content

Commit e74d52a

Browse files
committed
update
1 parent 19915e0 commit e74d52a

File tree

7 files changed

+60
-36
lines changed

7 files changed

+60
-36
lines changed

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "alipay_sdk_rust"
33
license = "MIT"
4-
version = "1.0.13"
4+
version = "1.0.14"
55
edition = "2018"
66
authors = ["wandercn<[email protected]>"]
77
description = "AliPay Sdk for Rust"
@@ -14,12 +14,12 @@ categories = ["api-bindings", "accessibility", "development-tools", "compilers"]
1414
jsonmap = "0.1"
1515
serde = { version = "1.0", features = ["derive"] }
1616
serde_json = "1.0"
17-
gostd = "0.4.1"
17+
gostd = "0.4"
1818
sha2 = "0.10.2"
1919
base64 = "0.22.1"
2020
rsa = "0.6.1"
2121
uuid = { version = "1.0.0", features = ["v4", "fast-rng", "macro-diagnostics"] }
22-
serde_with = "1.14.0"
22+
serde_with = "3.12.0"
2323
log = "0.4"
2424
x509-parser = "0.17.0"
2525
md5 = "0.7.0"

src/cert.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ use x509_parser::prelude::*;
88

99
use log::debug;
1010

11+
use crate::util::base64_encode;
12+
1113
/// get_cert_sn 获取证书序列号SN
1214
/// cert_path:X.509证书文件路径(appCertPublicKey.crt、alipayCertPublicKey_RSA2.crt)
1315
/// 返回 sn:证书序列号(app_cert_sn、alipay_cert_sn)
@@ -100,7 +102,7 @@ pub fn get_public_key_with_path<'a>(alipay_cert_path: impl AsRef<str>) -> Result
100102
let cert_data = &fs::read(alipay_cert_path.as_ref())?;
101103
let cert = load_certificate(cert_data)?;
102104
match cert.parse_x509() {
103-
Ok(certificate) => Ok(base64::encode(certificate.public_key().raw)),
105+
Ok(certificate) => Ok(base64_encode(certificate.public_key().raw)),
104106
Err(err) => Err(Error::new(ErrorKind::Other, err.to_string())),
105107
}
106108
}

src/pay.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ impl PayClient {
481481
parameters.insert(k, v[0].to_string());
482482
}
483483

484-
let form = build_form(&self.api_url(), &mut parameters)
484+
let form = build_form(&self.api_url(), &mut parameters)?
485485
.as_bytes()
486486
.to_vec();
487487
Ok(form)

src/sign.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@ use std::{
1616

1717
use sha2::{Digest, Sha256};
1818

19-
use crate::error::AliPaySDKError::AliPayError;
20-
use crate::error::{AliPayResult, AliPaySDKError};
19+
use crate::{error::AliPaySDKError::AliPayError, util::base64_encode};
20+
use crate::{
21+
error::{AliPayResult, AliPaySDKError},
22+
util::base64_decode,
23+
};
2124
/// 签名接口
2225
pub trait Signer {
2326
fn set_private_key(&mut self, private_key_str: &str) -> AliPayResult<()>;
@@ -79,7 +82,7 @@ impl Signer for SignSHA256WithRSA {
7982
PaddingScheme::new_pkcs1v15_sign(Some(Hash::SHA2_256)),
8083
digest.as_slice(),
8184
) {
82-
Ok(base64::encode(signature_byte))
85+
Ok(base64_encode(signature_byte))
8386
} else {
8487
Err(AliPayError("pkcs1v15_sign failed".to_string()))
8588
}
@@ -88,7 +91,7 @@ impl Signer for SignSHA256WithRSA {
8891
fn verify(&self, source: &str, signature: &str) -> AliPayResult<bool> {
8992
let mut hashed = Sha256::new();
9093
hashed.update(source.as_bytes());
91-
if let Ok(decode_signature) = base64::decode(signature) {
94+
if let Ok(decode_signature) = base64_decode(signature) {
9295
match self.public_key.as_ref().unwrap().verify(
9396
PaddingScheme::new_pkcs1v15_sign(Some(Hash::SHA2_256)),
9497
&hashed.finalize(),

src/tests/sign_test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use gostd::strings;
22

33
use crate::sign::{builder, Signer};
4-
use anyhow::{Context, Result};
4+
use anyhow::Result;
55
const PRIVATE_KEY_FILE: &str = "src/tests/ffactory.org_私钥.txt"; // 沙箱环境自定义测试密钥
66
const PUBILC_KEY_FILE: &str = "src/tests/ffactory.org_公钥.txt"; // 沙箱环境自定义测试密钥
77
const SOURCE_URL: &str = r#"alipay_root_cert_sn=687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6&app_cert_sn=1aca24501cc5cd3ac19089ff49d99d63&app_id=2021000117650139&biz_content={"buyer_id":"2088102175953034","out_trade_no":"1620630871769533001","subject":"iPhone","timestamp":"2021-05-08 17:09:04","total_amount":"88.88"}&charset=utf-8&format=JSON&method=alipay.trade.create&sign_type=RSA2&timestamp=2021-05-12 17:18:09&version=1.0"#;

src/tests/trade_create_test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use anyhow::{Context, Result};
1+
use anyhow::Result;
22

33
use crate::{
44
biz::{self, BizContenter},

src/util.rs

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// #![allow(unused)]
33

44
use super::biz::BizContenter;
5+
use crate::error::AliPayResult;
56
use gostd::builtin::len;
67
use gostd::io::StringWriter;
78
use gostd::strings;
@@ -30,43 +31,46 @@ pub fn get_out_trade_no() -> String {
3031
Uuid::new_v4().to_string()
3132
}
3233

33-
pub fn build_form(base_url: &str, parameters: &mut HashMap<String, String>) -> String {
34+
pub fn build_form(
35+
base_url: &str,
36+
parameters: &mut HashMap<String, String>,
37+
) -> AliPayResult<String> {
3438
let mut buf = strings::Builder::new();
35-
buf.WriteString("<form name=\"alipaysubmit\" method=\"post\" action=\"");
36-
buf.WriteString(base_url);
37-
buf.WriteString("?charset=utf-8");
38-
buf.WriteString("\">\n");
39-
buf.WriteString(&build_hidden_fields(parameters));
40-
buf.WriteString("<input type=\"submit\" value=\"立即支付\" style=\"display:none\" >\n");
41-
buf.WriteString("</form>\n");
42-
buf.WriteString("<script>document.forms['alipaysubmit'].submit();</script>");
43-
buf.String()
39+
buf.WriteString("<form name=\"alipaysubmit\" method=\"post\" action=\"")?;
40+
buf.WriteString(base_url)?;
41+
buf.WriteString("?charset=utf-8")?;
42+
buf.WriteString("\">\n")?;
43+
buf.WriteString(&build_hidden_fields(parameters)?)?;
44+
buf.WriteString("<input type=\"submit\" value=\"立即支付\" style=\"display:none\" >\n")?;
45+
buf.WriteString("</form>\n")?;
46+
buf.WriteString("<script>document.forms['alipaysubmit'].submit();</script>")?;
47+
Ok(buf.String())
4448
}
4549

46-
fn build_hidden_fields(parameters: &mut HashMap<String, String>) -> String {
50+
fn build_hidden_fields(parameters: &mut HashMap<String, String>) -> AliPayResult<String> {
4751
if parameters.is_empty() {
48-
return "".to_string();
52+
return Ok("".to_string());
4953
}
5054
let mut buf = strings::Builder::new();
5155
for (key, value) in parameters {
5256
if value.is_empty() {
5357
continue;
5458
}
55-
buf.WriteString(&build_hidden_field(key, value));
59+
buf.WriteString(&build_hidden_field(key, value)?)?;
5660
}
57-
buf.String()
61+
Ok(buf.String())
5862
}
5963

60-
fn build_hidden_field(key: &str, value: &str) -> String {
64+
fn build_hidden_field(key: &str, value: &str) -> AliPayResult<String> {
6165
let mut buf = strings::Builder::new();
62-
buf.WriteString("<input type=\"hidden\" name=\"");
63-
buf.WriteString(key);
64-
buf.WriteString("\" value=\"");
66+
buf.WriteString("<input type=\"hidden\" name=\"")?;
67+
buf.WriteString(key)?;
68+
buf.WriteString("\" value=\"")?;
6569
// 转义双引号
6670
let a = strings::ReplaceAll(value, "\"", "&quot;");
67-
buf.WriteString(&a);
68-
buf.WriteString("\">\n");
69-
buf.String()
71+
buf.WriteString(&a)?;
72+
buf.WriteString("\">\n")?;
73+
Ok(buf.String())
7074
}
7175

7276
// 只支持value是{}或[]或""包裹的key,不支持数字
@@ -91,7 +95,7 @@ pub fn json_get(result: &str, key: &str) -> String {
9195
if current == b'{' || current == b'[' {
9296
left_brackets += 1;
9397
}
94-
98+
9599
if (current == b']' || current == b'}') && left_brackets == 0 {
96100
break;
97101
}
@@ -118,14 +122,13 @@ pub fn json_get(result: &str, key: &str) -> String {
118122
}
119123

120124
use gostd::net::url;
121-
use std::io::Result;
122125

123126
// 获取支付宝CallBack异步消息的待签名字符串和签名
124127
// 自行实现签名文档 https://opendocs.alipay.com/common/02mse7?pathHash=096e611e
125128
// 返回值 source - 签名字符串 , sign - 签名 , sign_type - 签名类型
126-
pub fn get_async_callback_msg_source(raw_body: &[u8]) -> Result<(String, String, String)> {
129+
pub fn get_async_callback_msg_source(raw_body: &[u8]) -> AliPayResult<(String, String, String)> {
127130
// 解析 URL 查询字符串
128-
let raw_str = String::from_utf8_lossy(raw_body);
131+
let raw_str = std::str::from_utf8(raw_body)?;
129132
let values = url::ParseQuery(&raw_str)?;
130133

131134
let sign_type = values.Get("sign_type");
@@ -153,3 +156,19 @@ pub fn get_async_callback_msg_source(raw_body: &[u8]) -> Result<(String, String,
153156

154157
Ok((source, sign, sign_type))
155158
}
159+
160+
use base64::{engine::general_purpose, DecodeError, Engine as _};
161+
162+
pub fn base64_encode<T>(input: T) -> String
163+
where
164+
T: AsRef<[u8]>,
165+
{
166+
general_purpose::STANDARD.encode(input)
167+
}
168+
169+
pub fn base64_decode<T>(input: T) -> Result<Vec<u8>, DecodeError>
170+
where
171+
T: AsRef<[u8]>,
172+
{
173+
general_purpose::STANDARD.decode(input)
174+
}

0 commit comments

Comments
 (0)