PayPal集成加密解决办法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PayPal集成加密解决办法
PayPal在线支付加密经过几天的折腾重要搞定了,算是松了一口气。
参考了贝宝公司提供的资料又参考了几个国外网站终于把支付数据的加密过程搞定了。
PayPal顾问Candy 说实话PayPal做的在线支付还是相当不错了,不但提供了很多中接口,还提供了多种界面的定制,最为麻烦的地方就是提交数据加密的过程。
可惜这一点贝宝公司就做的有点不太好了,程序代码更新不够及时,贝宝公司提供给我们的程序都是.NET 1.0的程序与2.0不兼容,虽说代码没什么但是让人头疼的事提供了一个C++项目、一个C#的项目,经过C++编译后的DLL 被C#调用生成加密数据的代码。
而且按照贝宝公司提供的使用方法还要安装OpenSSL,将这个里面的Include文件中OpenSSL下面用到的C++引用的头文件,导入到C++项目中,由于Include目录下头文件(扩展名.h)都不标准,也就是头文件中引用其他头文件路径都不对,由于.net 1.0下的C++编译器与.net 2.0下的编译器编译程序还是有不少差别的,所以代码有几处要修改。
使用起来相当繁琐。
折腾了两天我都快疯了,呵呵~。
终于体会到搞C++的同胞的痛苦了。
废话不说了,下面我说我的解决办法:
2.0 类库中集成了加密认证的类库。
我们用的到的
System.Security.Cryptography.Pkcs;//命名空间提供了公钥加密标准(PKCS) 的编程元素,包括用于对数据签名的方法、用于交换密钥的方法、用于请求证书的方法、用于公钥加密和解密的方法,以及用于其他安全性功能的方法。
System.Security.Cryptography.X509Certificates;//Authenticode X.509 v.3
2.接下来就是编写一个加密类,使用PayPal提供的公钥加密数据,然后自己的私钥key也就是创建私钥时候填写的密码与通过自己的公钥与私钥生成的证书(扩展名 .12)数据。
3.下面是我在沙盒中测试用的代码,需要注意的就是名字是”cmd”的input控件的值是”_s-xclick”,其他的贝宝不识别。
?????? <form target=”paypal”action=”
https:///cgi-bin/webscr
”method=”post“>
<input type=”image” src=”images.jpg”border=”0”name=”submit”alt=”PayPal is the safer, easier way to pay –PayPal“>
<input type=”hidden”name=”cmd”value=”_s-xclick“>
<input type=”hidden”name=”encrypted”value=”<%print(); %> “/> 页面输出后的代码是:
<form target=”paypal”action=”https:///cgi-bin/webscr ”method=”post”>
<input type=”image”src=”images.jpg”border=”0”name=”submit”alt=”PayPal is the safer, easier way to pay –PayPal“>
<input type=”hidden”name=”cmd”value=”_s-xclick“>
<input type=”hidden”name=”encrypted”value=”—–BEGIN PKCS7—–!!!!省略了!!!!—–END PKCS7—–“/>
</form>
代码补充【2009\11\29】:
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using Pkcs = System.Security.Cryptography.Pkcs;
using X509 = System.Security.Cryptography.X509Certificates;
namespacecom.apress.paypal
{
public class ButtonEncryption
{
private Encoding _encoding = Encoding.Default;
private string _recipientPublicCertPath;
private X509.X509Certificate2 _signerCert;
private X509.X509Certificate2 _recipientCert;
publicButtonEncryption()
{
}
#region Properties
/// <summary>
/// Character encoding, e.g. UTF-8, Windows-1252
/// </summary>
public string Charset
{
get { return _encoding.WebName; }
set
{
if (value != null && value != “”)
{
_encoding = Encoding.GetEncoding(value);
}
}
}
/// <summary>
/// Path to the recipient’s public certificate in PEM format /// </summary>
public string RecipientPublicCertPath
{
get { return _recipientPublicCertPath; }
set
{
_recipientPublicCertPath = value;
_recipientCert =
new X509.X509Certificate2(_recipientPublicCertPath);
}
}
#endregion
/// <summary>
/// Loads the PKCS12 file which contains the public certificate
/// and private key of the signer
/// </summary>
/// <param name=”signerPfxCertPath”>
/// File path to the signer’s public certificate plus private key
/// in PKCS#12 format</param>
/// <param name=”signerPfxCertPassword”>
/// Password for signer’s private key</param>
public void LoadSignerCredential(string signerPfxCertPath,
string signerPfxCertPassword)
{
_signerCert =
new X509.X509Certificate2(signerPfxCertPath, signerPfxCertPassword); }
/// <summary>
/// Sign a message and encrypt it for the recipient.
/// </summary>
/// <param name=”clearText”>Name value pairs
/// must be separated by \n (vbLf or chr(10)),
/// for example “cmd=_xclick\nbusiness=…”</param>
/// <returns></returns>
public string SignAndEncrypt(string clearText)
{
string result = null;
byte[] messageBytes = _encoding.GetBytes(clearText);
byte[] signedBytes = Sign(messageBytes);
byte[] encryptedBytes = Envelope(signedBytes);
result = Base64Encode(encryptedBytes);
return result;
}
private byte[] Sign(byte[] messageBytes)
{
Pkcs.ContentInfo content = new Pkcs.ContentInfo(messageBytes); Pkcs.SignedCms signed = new Pkcs.SignedCms(content); Pkcs.CmsSigner signer = new Pkcs.CmsSigner(_signerCert); puteSignature(signer);
byte[] signedBytes = signed.Encode();
returnsignedBytes;
}
private byte[] Envelope(byte[] contentBytes)
{
Pkcs.ContentInfo content = new Pkcs.ContentInfo(contentBytes); Pkcs.EnvelopedCmsenvMsg = new Pkcs.EnvelopedCms(content); Pkcs.CmsRecipient recipient =
new Pkcs.CmsRecipient(
Pkcs.SubjectIdentifierType.IssuerAndSerialNumber, _recipientCert); envMsg.Encrypt(recipient);
byte[] encryptedBytes = envMsg.Encode();
returnencryptedBytes;
}
private string Base64Encode(byte[] encoded)
{
const string PKCS7_HEADER = “—–BEGIN PKCS7—–”;
const string PKCS7_FOOTER = “—–END PKCS7—–”;
string base64 = Convert.ToBase64String(encoded); StringBuilder formatted = new StringBuilder();
formatted.Append(PKCS7_HEADER);
formatted.Append(base64);
formatted.Append(PKCS7_FOOTER);
return formatted.ToString();
}
}
}。