RechangeOrderController.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Mead
  5. * Date: 2019/8/19
  6. * Time: 2:11 PM
  7. */
  8. namespace App\Http\Controllers\V1;
  9. use App\Http\Requests\RechangeMoneyRequest;
  10. use App\Jobs\CloseOrderJob;
  11. use App\Models\Auth;
  12. use App\Models\DepositOrder;
  13. use App\Models\RechargeConfiguration;
  14. use App\Models\RechargeOrder;
  15. use App\Repositories\RechargeConfigurationRepository;
  16. use Carbon\Carbon;
  17. use Dingo\Api\Http\Request;
  18. use EasyWeChat\Factory;
  19. use Illuminate\Support\Facades\Log;
  20. use function EasyWeChat\Kernel\Support\generate_sign;
  21. /**
  22. * 充值余额模块
  23. * Class RechangeOrderController
  24. * @package App\Http\Controllers\V1
  25. */
  26. class RechangeOrderController extends BaseController
  27. {
  28. /**
  29. * 充值
  30. * @param Request $request
  31. * User: Mead
  32. */
  33. public function store(RechangeMoneyRequest $request, RechargeConfigurationRepository $rechargeConfigurationRepository)
  34. {
  35. try {
  36. $area_id = $request->get('area_id', $this->user->register_area_id);
  37. $money = $request->get('money');
  38. $recharge_configuration_id = $request->get('config_id', 0);
  39. $config = [];
  40. $setting = false;
  41. if ($recharge_configuration_id) {
  42. //参与活动
  43. $setting = $rechargeConfigurationRepository->byIdGetActiveModel($recharge_configuration_id);
  44. if (bccomp($money, $setting->recharge_money, 0) !== 0) {
  45. $money = $setting->recharge_money;
  46. }
  47. } else {
  48. $setting = $rechargeConfigurationRepository->byMoneyGetActiveModel($money, $area_id);
  49. }
  50. if ($setting) {
  51. if ((int)$setting->area_id !== (int)$area_id) {
  52. return $this->errorNoValidation('该区域暂不支持此活动');
  53. }
  54. $config = $setting->only(['id', 'recharge_money', 'give_money', 'discount', 'area_id', 'name']);
  55. // if (bccomp($setting->discount, 1.00, 2) < 0) {
  56. // // 有折扣
  57. // }
  58. }
  59. switch (self::$SOURCE_TYPE ){
  60. case self::SOURCE_TYPE_WECHAT:
  61. $source_type = RechargeOrder::PAY_TYPE_WECHAT;
  62. break;
  63. case self::SOURCE_TYPE_ALIPAY:
  64. $source_type = RechargeOrder::PAY_TYPE_ALIPAYMINI;
  65. break;
  66. }
  67. $data = [
  68. 'area_id' => $area_id,
  69. 'recharge_money' => $money,
  70. 'preferential_money' => 0.00,
  71. 'total_money' => $money,
  72. 'pay_money' => $money,
  73. 'user_id' => $this->user->id,
  74. 'no' => RechargeOrder::makeNo(self::$ORDER_TAG),
  75. 'pay_status' => RechargeOrder::PAY_STATUS_NO,
  76. 'pay_type' => $source_type,
  77. 'recharge_config' => php2js($config),
  78. 'merchant_id' => self::$MERCHANT_ID
  79. ];
  80. $order = RechargeOrder::create($data);
  81. // $auth = $this->user->auth;
  82. //获取对应小程序的登录信息
  83. $user_id = $this->user->id;
  84. $this->dispatch(new CloseOrderJob($order, Carbon::now()->addMinutes(30)));
  85. $userauth = userAuthinfo(self::$MERCHANT, $user_id);
  86. if ($userauth['code'] != 1) {
  87. return $this->errorNoValidation('用户信息有误');
  88. }
  89. switch (self::$SOURCE_TYPE ) {
  90. case self::SOURCE_TYPE_WECHAT: //RechargeOrder::PAY_TYPE_WECHAT
  91. $payment = Factory::payment(wechat_pay_config(self::$MERCHANT)); // 微信支付
  92. $result = $payment->order->unify([
  93. 'body' => "用户余额充值-" . self::$MERCHANT['wxapp_name'],
  94. 'out_trade_no' => $order->no,
  95. 'trade_type' => 'JSAPI', // 必须为JSAPI
  96. 'openid' => $userauth['data']['credential'], // 这里的openid为付款人的openid
  97. 'total_fee' => wechat_fee($order->pay_money), // 总价
  98. 'attach' => makeNoTag(RechargeOrder::NO_TAG)
  99. ]);
  100. // 如果成功生成统一下单的订单,那么进行二次签名
  101. if ($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS') {
  102. // 二次签名的参数必须与下面相同
  103. $params = [
  104. 'appId' => $userauth['data']['identifier'],
  105. 'timeStamp' => time(),
  106. 'nonceStr' => $result['nonce_str'],
  107. 'package' => 'prepay_id=' . $result['prepay_id'],
  108. 'signType' => 'MD5',
  109. ];
  110. // self::$MERCHANT['pay_key']为商户的key
  111. $params['paySign'] = generate_sign($params, self::$MERCHANT['pay_key']);
  112. return $this->response->array($params);
  113. }
  114. break;
  115. case self::SOURCE_TYPE_ALIPAY:
  116. $result = alipay_mini_pay(self::$MERCHANT, "用户余额充值-" . self::$MERCHANT['wxapp_name'], $order->no, $order->pay_money, $userauth['data']['credential']);
  117. if ($result['code'] != 1) {
  118. return $this->errorNoValidation($result['msg']);
  119. }
  120. $response['tradeNo'] = $result['data']->tradeNo; //获取支付宝订单号
  121. return $this->response->array($response);
  122. break;
  123. default:
  124. return $this->errorNoValidation('支付方式错误');
  125. }
  126. Log::error($result);
  127. return $this->errorNoValidation('下单失败');
  128. } catch (\Exception $exception) {
  129. return $this->exception($exception);
  130. }
  131. }
  132. }