0

暗号化された URL を生成して、支払いのために顧客を PayPal にリダイレクトしようとしています。自分の証明書を PayPal にアップロードし、PayPal の公開証明書をダウンロードし、次のコードを使用してジョブを実行しました。

  Dim _vals As String = "cert_id=ID" & vbLf & "cmd=_cart" & vbLf & _
               "business=businessemail" & vbLf & _
               "upload=1" & vbLf & _
               "no_shipping=1" & vbLf & _
               "custom=poidccffgd" & vbLf & _
               "invoice=oid12345" & vbLf & _
               "currency_code=EUR" & vbLf & _
               "item_name_1=" & _oname & vbLf & _
               "amount_1=" & _curps & vbLf & _
               "item_number_1=10" & vbLf & _
               "item_name_2=Free Bonus" & vbLf & _
               "amount_2=0" & vbLf & _
               "discount_rate_cart=30"

    Dim _url As String = "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_s-xclick&encrypted=" & Server.UrlEncode(EncryptX509(_vals))

Friend Shared Function EncryptX509(aData As String) As String
    Dim _signerCert As New X509Certificates.X509Certificate2(MyPrivateCertificateByteArray, "password", X509Certificates.X509KeyStorageFlags.DefaultKeySet)
    Dim _recipientCert As New X509Certificates.X509Certificate2(PayPalPublicCertificateByteArray)
    'get data
    '--------
    Dim messageBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(aData)
    'sign
    '----
    Dim content = New System.Security.Cryptography.Pkcs.ContentInfo(messageBytes)

    Dim signed = New System.Security.Cryptography.Pkcs.SignedCms(content)
    Dim signer = New System.Security.Cryptography.Pkcs.CmsSigner(_signerCert)
    signed.ComputeSignature(signer)
    Dim signedBytes = signed.Encode()
    'encrypt
    '-------
    Dim content2 = New System.Security.Cryptography.Pkcs.ContentInfo(signedBytes)
    Dim envMsg = New System.Security.Cryptography.Pkcs.EnvelopedCms(content2)
    Dim recipient = New Pkcs.CmsRecipient(Pkcs.SubjectIdentifierType.IssuerAndSerialNumber, _recipientCert)
    envMsg.Encrypt(recipient)
    Dim encryptedBytes As Byte() = envMsg.Encode()
    'format
    '------
    Const PKCS7_HEADER As String = "-----BEGIN PKCS7-----"
    Const PKCS7_FOOTER As String = "-----END PKCS7-----"

    Dim base64 = Convert.ToBase64String(encryptedBytes)
    Dim formatted = New StringBuilder()
    formatted.Append(PKCS7_HEADER)
    formatted.Append(base64)
    formatted.Append(PKCS7_FOOTER)
    Return formatted.ToString
End Function

それでも、生成された URL にアクセスすると、証明書 ID をデコードできないと表示されます。ライブとサンドボックスの両方で試しましたが、同じ結果が得られました。このコードの問題は何ですか? ASP.NET で動作する EWP を取得するにはどうすればよいですか? ホスト型エクスプレス チェックアウトやホスト型ボタンなどの代替方法を提案しないでください。

ありがとうございました。

4

1 に答える 1