You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
4.0 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. <?php
  2. namespace App\Controller;
  3. use App\Constants\ErrorCode;
  4. use App\Model\OrderMain;
  5. use App\Request\WxminiPayRequest;
  6. use EasyWeChat\Factory;
  7. use Hyperf\Guzzle\CoroutineHandler;
  8. class PaymentController extends BaseController
  9. {
  10. public function wxminiPayOnline(WxminiPayRequest $request){
  11. $data = $request->validated();
  12. $config = config('wxpay');
  13. $app = Factory::payment($config);
  14. $app['guzzle_handler'] = CoroutineHandler::class;
  15. // 待支付的,未超时(15min,900sec)的订单
  16. $orderMain = OrderMain::query()
  17. ->where(['state' => OrderMain::ORDER_STATE_UNPAY, 'id' => $data['order_id']])
  18. ->where('time', '>=', date('Y-m-d H:i:s', (time()-900)))
  19. ->first();
  20. if (empty($orderMain)) {
  21. return $this->result(ErrorCode::PAY_FAILURE, $data,'订单不存在或已失效');
  22. }
  23. $result = $app->order->unify([
  24. 'body' => '懒族生活 - 外卖下单',
  25. 'out_trade_no' => $orderMain->global_order_id,
  26. // 'total_fee' => bcmul(floatval($orderMain->money), 100, 0),
  27. 'total_fee' => 1,
  28. 'notify_url' => config('site_host') . '/v1/notify/wxminionline',
  29. 'trade_type' => 'JSAPI',
  30. 'openid' => $data['openid'],
  31. ]);
  32. // 返回支付参数给前端
  33. $parameters = [
  34. 'appId' => $result['appid'],
  35. 'timeStamp' => '' . time() . '',
  36. 'nonceStr' => uniqid(),
  37. 'package' => 'prepay_id=' . $result['prepay_id'],
  38. 'signType' => 'MD5'
  39. ];
  40. $parameters['paySign'] = $this->signture($parameters, $config['key']);
  41. return $this->success($parameters);
  42. }
  43. public function wxminiPayOffline(WxminiPayRequest $request){
  44. $data = $request->validated();
  45. $config = config('wxpay');
  46. $app = Factory::payment($config);
  47. $app['guzzle_handler'] = CoroutineHandler::class;
  48. // 待支付的,未超时(15min,900sec)的订单
  49. $orderMain = OrderMain::query()
  50. ->where(['dm_state' => OrderMain::ORDER_STATE_UNPAY, 'id' => $data['order_id']])
  51. ->where('time', '>=', date('Y-m-d H:i:s', (time()-900)))
  52. ->first();
  53. if (empty($orderMain)) {
  54. return $this->result(ErrorCode::PAY_FAILURE, $data,'订单不存在或已失效');
  55. }
  56. $result = $app->order->unify([
  57. 'body' => '懒族生活 - 当面支付',
  58. 'out_trade_no' => $orderMain->global_order_id,
  59. 'total_fee' => bcmul(floatval($orderMain->money), 100, 0),
  60. 'notify_url' => config('site_host') . '/v1/notify/wxminioffline',
  61. 'trade_type' => 'JSAPI',
  62. 'openid' => $data['openid'],
  63. ]);
  64. // 返回支付参数给前端
  65. $parameters = [
  66. 'appId' => $result['appid'],
  67. 'timeStamp' => '' . time() . '',
  68. 'nonceStr' => uniqid(),
  69. 'package' => 'prepay_id=' . $result['prepay_id'],
  70. 'signType' => 'MD5'
  71. ];
  72. $parameters['paySign'] = $this->signture($parameters, $config['key']);
  73. return $this->success($parameters);
  74. }
  75. /**
  76. * 支付参数加签
  77. * @param $parameters
  78. * @param $key
  79. * @return string
  80. */
  81. private function signture($parameters, $key)
  82. {
  83. // 按字典序排序参数
  84. ksort($parameters);
  85. // http_query
  86. $queryParams = $this->http_query($parameters);
  87. // 加入KEY
  88. $queryParams = $queryParams . "&key=" . $key;
  89. // MD5加密
  90. $queryParams = md5($queryParams);
  91. // 字符转为大写
  92. return strtoupper($queryParams);
  93. }
  94. /**
  95. * 参数转为http query字串
  96. * @param $parameters
  97. * @return string
  98. */
  99. private function http_query($parameters) {
  100. $http_query = [];
  101. foreach ($parameters as $key => $value) {
  102. $http_query[] = $key.'='.$value;
  103. }
  104. return implode('&', $http_query);
  105. }
  106. }