集成支付宝移动支付总结

Posted by Leon on 2016-03-29

申请成功后移动支付功能以后,就可以开始集成支付功能了。移动支付签名是 RSA 加密,必须生成对应的私钥、公钥,生成方式如下:

1
2
3
openssl genrsa -out rsa_private_key.pem 1024 生成RSA私钥
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt 将RSA私钥转换成PKCS8格式
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 生成公钥

然后把生成的公钥在支付宝后台 合作伙伴密钥 > 安全校验码(key) > RSA加密 添加到 查看开发者公钥 里。需要注意的是,公钥要去掉 -----BEGIN PUBLIC KEY...END PUBLIC KEY------ 字样,然后去掉换行和空格合并为一条字符串添加即可。

设置完成后接下来就需要集成客户端了,由于客户端调用支付需要生成签名信息,而签名信息需要使用私钥生成。为了安全性,私钥需保存到服务端然后服务器负生成客户端调用支宝所有的支付信息返回给客户端即可。

生成支付信息关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//.NET代码
public static string PayInfo(string out_trade_no, decimal total_fee, string productname, string body = "描述")
{
if (total_fee == 0) return "";
Dictionary<string, string> sPara = new Dictionary<string, string>();
sPara["partner"] = "2034112123237891"; //合作伙伴身份(PID)
sPara["seller_id"] = "[email protected]"; //注册邮箱
sPara["out_trade_no"] = out_trade_no; //商家订单号,eg:5463910349164448568000008
sPara["subject"] = productname;
sPara["body"] = body;
sPara["total_fee"] = total_fee; //订单金额,记得保留两位小数
sPara["notify_url"] = "http://xxx/resultnotify"; //支付消息异步或同步通知地址
sPara["service"] = "mobile.securitypay.pay";
sPara["payment_type"] = "1";
sPara["_input_charset"] = Config.Input_charset;
sPara["it_b_pay"] = "30m";
sPara["show_url"] = "m.alipay.com";

//拼接URL字符串,一定要把参数Value加双引号
string link_url = CreatePayLinkString(sPara);

//生成签名,并对签名做URLEncode转码。
//私钥使用PKCS8格式,并去掉 `-----BEGIN...END ------ ` 字样,然后去掉换行和空格合并为一条字符串
string sign =HttpUtility.UrlEncode(RSAFromPkcs8.sign(link_url, Config.Private_key, Config.Input_charset), Encoding.GetEncoding("utf-8"));

return link_url + "&sign=\"" + sign + "\"&sign_type=\"" + Config.Sign_type + "\""; //返回支付信息
}


private static string CreatePayLinkString(Dictionary<string, string> dicArray)
{
StringBuilder prestr = new StringBuilder();
foreach (KeyValuePair<string, string> temp in dicArray)
{
prestr.Append(temp.Key + "=\"" + temp.Value + "\"&");
}
int nLen = prestr.Length;
prestr.Remove(nLen - 1, 1);
return prestr.ToString();
}

以上涉及到的加密方法,可在 支付宝SDK服务端 Demo 找到。

最后客户端调用服务的下单接口,拿到支付信息调起支付宝发起支付。

最后根据支付宝服务器异步通知的消息对订单进行相应的逻辑处理。(异步通知代码可参考 Demo)

相关资料: