PunishmentOrderController.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. /**
  3. *
  4. *
  5. * @category xxx
  6. * @package PSR
  7. * @subpackage Documentation\API
  8. * @author xxx <xxx@xxx.com>
  9. * @license GPL https://xxx.com
  10. * @link https://xxx.com
  11. * @ctime: 2020/5/19 9:33
  12. */
  13. namespace App\Http\Controllers\V1;
  14. use App\Http\Requests\PunishmentOrderRequest;
  15. use App\Models\PunishmentOrder;
  16. use App\Repositories\PunishmentOrderRepository;
  17. use App\Transformers\PunishmentOrdersTransformer;
  18. use App\Transformers\PunishmentOrderTransformer;
  19. use function EasyWeChat\Kernel\Support\generate_sign;
  20. class PunishmentOrderController extends BaseController
  21. {
  22. public function index(PunishmentOrderRepository $punishmentOrderRepository)
  23. {
  24. try {
  25. $user_id = $this->user->id;
  26. $punishmentOrders = $punishmentOrderRepository->getAllByUserId($user_id);
  27. return $this->response->paginator($punishmentOrders, PunishmentOrdersTransformer::class);
  28. } catch (\Exception $e) {
  29. return $this->errorNoValidation($e->getMessage());
  30. }
  31. }
  32. public function show(PunishmentOrderRequest $punishmentOrderRequest, PunishmentOrderRepository $punishmentOrderRepository)
  33. {
  34. try {
  35. $no = $punishmentOrderRequest->get('no');
  36. $punishmentOrder = $punishmentOrderRepository->getModelByNo($no);
  37. if (empty($punishmentOrder)) return $this->errorNoValidation('找不到该罚单');
  38. return $this->response->item($punishmentOrder, PunishmentOrderTransformer::class);
  39. } catch (\Exception $e) {
  40. return $this->errorNoValidation($e->getMessage());
  41. }
  42. }
  43. public function pay(PunishmentOrderRequest $punishmentOrderRequest, PunishmentOrderRepository $punishmentOrderRepository)
  44. {
  45. try {
  46. $no = $punishmentOrderRequest->get('no');
  47. $punishmentOrder = $punishmentOrderRepository->getModelByNo($no);
  48. if (empty($punishmentOrder)) return $this->errorNoValidation('找不到该罚单');
  49. $payOk = $punishmentOrderRepository->isPay($no);
  50. if (!empty($payOk)) return $this->errorNoValidation('此罚单已支付');
  51. $user = $this->user();
  52. $payment = app('wechat.payment'); // 微信支付
  53. // $username = $user->truename;
  54. $auth = $user->auth;
  55. $result = $payment->order->unify([
  56. 'body' => "用户支付罚单-" . config('app.name', '未来bike'),
  57. 'out_trade_no' => $punishmentOrder->no,
  58. 'trade_type' => 'JSAPI', // 必须为JSAPI
  59. 'openid' => $auth['credential'], // 这里的openid为付款人的openid
  60. 'total_fee' => wechat_fee($punishmentOrder->pay_money), // 总价
  61. 'attach' => makeNoTag(PunishmentOrder::NO_TAG)
  62. ]);
  63. if ($result['return_code'] === 'FAIL') return $this->errorNoValidation('下单失败');
  64. // 如果成功生成统一下单的订单,那么进行二次签名
  65. if ($result['result_code'] === 'FAIL') {
  66. //判断是否重复下单
  67. if ($result['err_code'] === 'INVALID_REQUEST') {
  68. $punishmentOrder->no = PunishmentOrder::makeNo();
  69. $punishmentOrder->save();
  70. $result = $payment->order->unify([
  71. 'body' => "用户支付罚单-" . config('app.name', '未来bike'),
  72. 'out_trade_no' => $punishmentOrder->no,
  73. 'trade_type' => 'JSAPI', // 必须为JSAPI
  74. 'openid' => $auth['credential'], // 这里的openid为付款人的openid
  75. 'total_fee' => wechat_fee($punishmentOrder->pay_money), // 总价
  76. 'attach' => makeNoTag(PunishmentOrder::NO_TAG)
  77. ]);
  78. } else {
  79. return $this->errorNoValidation('下单失败');
  80. }
  81. }
  82. // 二次签名的参数必须与下面相同
  83. $params = [
  84. 'appId' => $auth['identifier'],
  85. 'timeStamp' => time(),
  86. 'nonceStr' => $result['nonce_str'],
  87. 'package' => 'prepay_id=' . $result['prepay_id'],
  88. 'signType' => 'MD5',
  89. ];
  90. // config('wechat.payment.default.key')为商户的key
  91. $params['paySign'] = generate_sign($params, config('wechat.payment.default.key'));
  92. $response = $params;
  93. $response['order_no'] = $punishmentOrder->no;
  94. return $this->response->array($response);
  95. } catch (\Exception $exception) {
  96. return $this->errorNoValidation($exception->getMessage());
  97. }
  98. }
  99. }