決済機能の開発で難しい部分はテストだと思います。
正常系、いわゆるクレジット経由で売り上げが立ところまでは、テスト用のクレジットカード情報が公開されているので比較的簡単にできますが、異常系、つまり決済がなにかしらの理由で処理されない場合のテストは、その現象を発生させるのが難しく頭を悩ませる部分かと思います。
PayPalには、いくつか異常系のテスト機能があるので、それを紹介したいと思います。
##クレジットカードが拒絶される(与信エラー)ケースのテスト
こちらの方法で実現できます。
買い手が買おうとした時に、登録している、もしくはしようとしているクレジットカードに与信上の問題がある(残高オーバー、その他与信的な問題)場合のテストでおそらく最も発生する率が高いケースかと思います。
##APIのエラーコードに対応したテストをする
PayPalのデベロッパーサイトでSandboxアカウントを作る際に、AccountDetail > Settingsの「Negative Testing」をOnにすると、各APIの特定のフィールド(ほとんどがAMTなどの決済額のフィールド)にエラーコードと同じ数値を小数点として指定することで、そのエラーコードに対応したエラーをAPIが返すようになります。
例:DoExpressCheckoutPayment APIでエラーコード10539を発生させたい場合、AMTに105.39を指定します。
通貨がJPYの場合はAMTに小数点は指定できないので、通貨はデフォルトのUSDを使います。
詳細は以下に載っています。
https://developer.paypal.com/docs/classic/lifecycle/sb_error-conditions/?mark=nrgativer%20testing
##支払いが保留などになるケースをテストする
PayPalは様々な不正検知の仕組みを持っているため、支払いがたまに即座に完了されず保留などになるケースがあります。
この状況をテストするには、上記同様SandboxのSettingsで「Payment review」をonにすると、すべての取引が完了せず、「保留」などのレビュー待ちになります。
詳細は以下に載っています。
https://developer.paypal.com/docs/classic/lifecycle/sb_payment-review/?mark=payment%20review%20test
上記3ポイントをテストしておけば、決済に絡むテストはかなりカバーできるのではと思います。
(もちろん通信障害やタイムアウトなどのシステム一般的なテストは別途必要ですが)