PaymentController.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use Response;
  5. use Redirect;
  6. use Captcha;
  7. use Cache;
  8. use PayPal\Api\Amount;
  9. use PayPal\Api\Details;
  10. use PayPal\Api\Item;
  11. use PayPal\Api\ItemList;
  12. use PayPal\Api\Payer;
  13. use PayPal\Api\Payment;
  14. use PayPal\Api\PaymentExecution;
  15. use PayPal\Api\RedirectUrls;
  16. use PayPal\Api\Transaction;
  17. use PayPal\Api\ShippingAddress;
  18. use PayPal\Rest\ApiContext;
  19. use PayPal\Auth\OAuthTokenCredential;
  20. class PaymentController extends Controller
  21. {
  22. protected static $config;
  23. private $apiContext;
  24. function __construct()
  25. {
  26. self::$config = $this->systemConfig();
  27. $this->apiContext = new ApiContext(
  28. new OAuthTokenCredential(self::$config['paypal_client_id'], self::$config['paypal_client_secret'])
  29. );
  30. $this->apiContext->setConfig([
  31. 'mode' => 'sandbox',
  32. 'log.LogEnabled' => true,
  33. 'log.FileName' => storage_path('logs/paypal.log'),
  34. 'log.LogLevel' => 'DEBUG', // PLEASE USE `INFO` LEVEL FOR LOGGING IN LIVE ENVIRONMENTS
  35. 'cache.enabled' => true,
  36. // 'http.CURLOPT_CONNECTTIMEOUT' => 30
  37. // 'http.headers.PayPal-Partner-Attribution-Id' => '123123123'
  38. //'log.AdapterFactory' => '\PayPal\Log\DefaultLogFactory' // Factory class implementing \PayPal\Log\PayPalLogFactory
  39. ]);
  40. }
  41. // 创建支付
  42. public function create(Request $request)
  43. {
  44. $payer = new Payer();
  45. $payer->setPaymentMethod("paypal");
  46. // 商品1
  47. $item1 = new Item();
  48. $item1->setName('Ground Coffee 40 oz')
  49. ->setCurrency('USD')
  50. ->setQuantity(1)
  51. ->setSku("123123")
  52. ->setPrice(20);
  53. // 商品2
  54. $item2 = new Item();
  55. $item2->setName('Granola bars')
  56. ->setCurrency('USD')
  57. ->setQuantity(5)
  58. ->setSku("456456")
  59. ->setPrice(10);
  60. // 写入商品列表
  61. $itemList = new ItemList();
  62. $itemList->setItems([$item1, $item2]);
  63. // 设定收货地址信息,防止用户自付款时可改
  64. $address = new ShippingAddress();
  65. $address->setRecipientName('什么名字')
  66. ->setLine1('什么街什么路什么小区')
  67. ->setLine2('什么单元什么号')
  68. ->setCity('城市名')
  69. ->setState('浙江省')
  70. ->setPhone('12345678911')
  71. ->setPostalCode('12345')
  72. ->setCountryCode('CN');
  73. // 商品列表写入设定好的地址信息
  74. $itemList->setShippingAddress($address);
  75. // 订单详情,带入运费和税,小计
  76. $details = new Details();
  77. $details->setShipping(5)
  78. ->setTax(10)
  79. ->setSubtotal(70);
  80. // 设定单据金额
  81. $amount = new Amount();
  82. $amount->setCurrency("USD")
  83. ->setTotal(85)
  84. ->setDetails($details);
  85. // 设定交易描述
  86. $transaction = new Transaction();
  87. $transaction->setAmount($amount)
  88. ->setItemList($itemList)
  89. ->setDescription("测试支付")
  90. ->setInvoiceNumber(uniqid());
  91. // 跳转页
  92. $redirectUrls = new RedirectUrls();
  93. $redirectUrls->setReturnUrl(url("payment/execute"))
  94. ->setCancelUrl(url("payment/cancel"));
  95. // 整个订单
  96. $payment = new Payment();
  97. $payment->setIntent("sale")
  98. ->setPayer($payer)
  99. ->setRedirectUrls($redirectUrls)
  100. ->setTransactions([$transaction]);
  101. // For Sample Purposes Only.
  102. $payment_request = clone $payment;
  103. // 创建支付
  104. try {
  105. $payment->create($this->apiContext);
  106. } catch (\Exception $ex) {
  107. var_dump($ex);
  108. exit(1);
  109. }
  110. // 得到支付授权跳转页(给用户点确认付款用)
  111. $approvalUrl = $payment->getApprovalLink();
  112. \Log::info($approvalUrl);
  113. \Log::info('22222'.var_export($payment_request, true));
  114. \Log::info('33333'.var_export($payment, true));
  115. return $payment;
  116. }
  117. // 执行支付
  118. public function execute(Request $request)
  119. {
  120. \Log::info('execute_params:'.var_export($request->all(), true));
  121. $paymentId = $request->get('paymentId');
  122. $token = $request->get('token');
  123. $PayerID = $request->get('PayerID');
  124. // ### Approval Status
  125. // Determine if the user approved the payment or not
  126. \Log::info($paymentId);
  127. \Log::info($token);
  128. \Log::info($PayerID);
  129. if (empty($paymentId) || empty($token) || empty($PayerID)) {
  130. exit("return_url支付回调地址错误");
  131. } else {
  132. // 支付
  133. $payment = Payment::get($paymentId, $this->apiContext);
  134. // 执行支付
  135. $execution = new PaymentExecution();
  136. $execution->setPayerId($PayerID);
  137. $transaction = new Transaction();
  138. $details = new Details();
  139. $details->setShipping(5)->setTax(10)->setSubtotal(70);
  140. $amount = new Amount();
  141. $amount->setCurrency('USD');
  142. $amount->setTotal(85);
  143. $amount->setDetails($details);
  144. $transaction->setAmount($amount);
  145. $execution->addTransaction($transaction);
  146. try {
  147. $result = $payment->execute($execution, $this->apiContext);
  148. \Log::info(var_export($result, true));
  149. // 支付成功,写入支付单据信息
  150. } catch (\Exception $ex) {
  151. var_dump($ex);
  152. echo "支付失败";
  153. exit(1);
  154. }
  155. \Log::info(var_export($payment, true));
  156. return $payment;
  157. }
  158. }
  159. // 取消支付
  160. public function cancel(Request $request)
  161. {
  162. var_dump($request->all());
  163. echo '取消支付';
  164. }
  165. // 查询支付状态
  166. public function query()
  167. {
  168. }
  169. }