22// #![allow(unused)]
33
44use super :: biz:: BizContenter ;
5+ use crate :: error:: AliPayResult ;
56use gostd:: builtin:: len;
67use gostd:: io:: StringWriter ;
78use 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, "\" " , """ ) ;
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
120124use 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