ASP.NET Core MVCにおける支付宝(Alipay)PCサイト決済実装ガイド

支付宝(Alipay)は多くの決済プロダクトを提供しており、例如としてQRコード決済、APP決済、モバイルサイト決済、PCサイト決済などがある。本稿では、PCサイト決済の実装方法を解説する。

1.プロジェクトの作成

ASP.NET Core 2.0のMVCプロジェクトを新規作成する。Visual Studioのテンプレートを使用して、標準的なMVCアプリケーションとして構築を進める。

2.沙箱環境(Sandbox Environment)

支付宝の決済APIを利用するには事業者アカウントが必要だが、開発段階では実環境を使用することが推奨されない。蚂蚁沙箱環境を提供しており、开发者がAPI機能を中心にテストを実行することが可能である。

沙箱環境へのアクセスは次のURLから行う: https://openhome.alipay.com/platform/appDaily.htm?tab=info

3.鍵ペアの生成

开放平台の沙箱環境ページにアクセスすると、まず必看セクションが表示される。ここでAPPID、支付宝ゲートウェイ、鍵情報など、開発に必要な情報を確認できる。

(各位の鍵情報は筆者と異なる可能性がある。筆者の環境ではすでに設定が完了しているためである)

鍵情報が表示されていない場合、公式の鍵生成ツールをダウンロードする必要がある。ダウンロードURLは以下: https://docs.open.alipay.com/291/105971

ツールを起動後、RSA署名検証ツール.batを実行する。「生成密钥」ボタンをクリックすると、秘密鍵と公開鍵のペアが生成される。

注意点として、Java開発でなければ「Java适用」オプションをクリックしないこと。秘密鍵と公開鍵は対をなすため、いずれか一方を紛失した場合は再度鍵ペアを生成し、両方を更新する必要がある。また、ここで生成した公開鍵は支付宝に提供するものであり、支付宝から返送される公開鍵こそが開発で使用する正式な鍵である。

生成した公開鍵を开放平台の鍵設定画面に貼り付けると、支付宝から正式な公開鍵が発行される。この支付宝公開鍵を開発で使用することになる。

SDKのセットアップ

設定情報を一元管理するConfigurationクラスを実装する。

public class AlipayConfiguration
{
    // アプリケーションID
    public static string ApplicationId { get; set; }
    
    // 支付宝ゲートウェイURL
    public static string GatewayUrl { get; set; }
    
    // マーチャント秘密鍵(RSA形式)
    public static string MerchantPrivateKey { get; set; }
    
    // 支付宝公開鍵
    public static string AlipayPublicKey { get; set; }
    
    // 署名アルゴリズム
    public static string SignatureMethod { get; } = "RSA2";
    
    // 文字コード
    public static string CharacterEncoding { get; } = "UTF-8";
}

各項目の値は开放平台で確認可能であり、自身の環境に 맞って設定する。merchantPrivateKeyには事前に生成した秘密鍵を、alipayPublicKeyには开放平台で設定後に発行された支付宝公開鍵を設定することを忘れないようにする。

**SDKパッケージの導入支付宝公式のSDKはNuGetパッケージとして提供されている。パッケージマネージャーコンソールから次のコマンドを実行してインストールする:

Install-Package Alipay.AopSdk.Core

SDKのソースコードを確認したい場合、次のリポジトリを参照すること: https://github.com/dotnetcore/Alipay.AopSdk.Core

決済処理の実装

PayControllerという名前のコントローラーを作成し、決済リクエスト処理メソッドを実装する。

public class PaymentController : Controller
{
    /// <summary>
    /// 支付宝決済リクエストの送信
    /// </summary>
    /// <param name="orderData">注文情報</param>
    [HttpPost]
    public IActionResult SubmitPayment(OrderDataModel orderData)
    {
        var aopClient = new DefaultAopClient(
            AlipayConfiguration.GatewayUrl,
            AlipayConfiguration.ApplicationId,
            AlipayConfiguration.MerchantPrivateKey,
            "json",
            "2.0",
            AlipayConfiguration.SignatureMethod,
            AlipayConfiguration.AlipayPublicKey,
            AlipayConfiguration.CharacterEncoding,
            false);

        var paymentModel = new AlipayTradePagePayModel
        {
            Body = orderData.ProductDescription,
            Subject = orderData.OrderName,
            TotalAmount = orderData.PaymentAmount,
            OutTradeNo = orderData.ReferenceNumber,
            ProductCode = "FAST_INSTANT_TRADE_PAY"
        };

        var paymentRequest = new AlipayTradePagePayRequest();
        paymentRequest.SetReturnUrl("http://localhost:5000/Payment/ResultCallback");
        paymentRequest.SetNotifyUrl("");
        paymentRequest.SetBizModel(paymentModel);

        var result = aopClient.SdkExecute(paymentRequest);
        System.Diagnostics.Debug.WriteLine($"決済リクエスト送信完了:注文番号 {orderData.ReferenceNumber}");
        
        return Redirect(AlipayConfiguration.GatewayUrl + "?" + result.Body);
    }
}

このメソッドでは、外部注文番号、注文名称、支払金額、商品説明の4つのパラメータを受け取る。これらを入力するための専用ビューを作成する。

public IActionResult PaymentForm()
{
    return View();
}
<h2>PCサイト支付宝決済</h2>
<form action="/Payment/SubmitPayment" method="post" role="form">
    <div>
        <p>商户订单号:</p>
        <input name="ReferenceNumber" value="" />
    </div>
    <div>
        <p>订单名称:</p>
        <input name="OrderName" value="テスト商品" />
    </div>
    <div>
        <p>付款金额:</p>
        <input name="PaymentAmount" value="0.01" />
    </div>
    <div>
        <p>商品描述:</p>
        <input name="ProductDescription" value="テスト取引" />
    </div>
    <input type="submit" value="提交"/>
</form>

商户订单号は开放平台の选看セクションで確認できる。必要情報を入力して送信ボタンを押下し、支付宝の決済画面に遷移すれば実装は完了である。

タグ: asp.net-core MVC 支付宝 alipay Payment Gateway

5月20日 23:02 投稿