Goodpay.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 商城小程序支付回调
  7. */
  8. namespace app\fastshop\controller\api\v3;
  9. use app\fastshop\controller\api\Base;
  10. use app\fastshop\model\Shopping;
  11. use app\fastshop\model\Vip;
  12. use app\fastshop\model\Config;
  13. use app\common\model\SystemMemberPayment;
  14. use app\common\model\SystemMemberBankBill;
  15. use app\common\model\SystemMemberBank;
  16. use sign\Sign;
  17. use filter\Filter;
  18. class Goodpay extends Base{
  19. protected $param = [];
  20. protected $config;
  21. public function initialize() {
  22. parent::initialize();
  23. if (request()->isPost()) {
  24. $fileContent = file_get_contents("php://input");
  25. if(empty($fileContent)){
  26. exit('FAIL');
  27. }
  28. $data = Sign::fromXml($fileContent);
  29. if(empty($data)){
  30. exit('FAIL');
  31. }
  32. if($data['return_code'] != 'SUCCESS'){
  33. exit('FAIL');
  34. }
  35. //支付接口
  36. $payment = SystemMemberPayment::config($this->miniapp_id,'wepay');
  37. if(empty($payment)){
  38. exit('FAIL');
  39. }
  40. //签名认证
  41. $args = [];
  42. $args['mchid'] = $data['mchid'];
  43. $args['goodpay_order'] = $data['goodpay_order'];
  44. $args['transaction_id'] = $data['transaction_id'];
  45. $args['out_trade_no'] = $data['out_trade_no'];
  46. $args['cash_fee'] = $data['cash_fee'];
  47. $args['time_end'] = $data['time_end'];
  48. $args['nonce_str'] = $data['nonce_str'];
  49. if($data['sign'] != Sign::makeSign($args,$payment['key'],'md5')){
  50. exit('FAIL');
  51. }
  52. //不参与签名
  53. $args['attach'] = $data['attach'];
  54. $args['state_desc'] = $data['state_desc'];
  55. $this->param = Filter::filter_escape($data);
  56. $this->config = Config::where(['member_miniapp_id' => $this->miniapp_id])->find();
  57. if($this->config->is_pay_types == 1 && $this->config->goodpay_tax > 0){
  58. $goodpay_tax = $this->param['cash_fee']/100*$this->config->goodpay_tax/100;
  59. SystemMemberBankBill::create(['state' => 1,'money' => $goodpay_tax,'member_id' => $this->miniapp->member_id,'message'=> '云收银台','update_time' => strtotime($this->param['time_end'])]);
  60. SystemMemberBank::moneyUpdate($this->miniapp->member_id,-$goodpay_tax);
  61. }
  62. }else{
  63. exit('FAIL');
  64. }
  65. }
  66. /**
  67. * 商城购买微信支付
  68. * @return void
  69. */
  70. public function shop(){
  71. $order = Shopping::where(['paid_at' => 0,'order_no' => $this->param['out_trade_no']])->find();
  72. if(empty($order)){
  73. return 'SUCCESS';
  74. }
  75. $order->paid_at = 1;
  76. $order->paid_time = strtotime($this->param['time_end']);
  77. $order->paid_no = $this->param['goodpay_order'];
  78. $order->save();
  79. return 'SUCCESS';
  80. }
  81. /**
  82. * 商城购买积分支付
  83. * @return void
  84. */
  85. public function shopPoint(){
  86. $order = Shopping::where(['paid_at' => 0,'order_no' => $this->param['out_trade_no']])->find();
  87. if(empty($order)){
  88. return 'SUCCESS';
  89. }
  90. $rel = widget('order/shopPointPay', ['miniapp_id' => $this->miniapp_id,'cash_fee'=> $order->order_amount,'uid' => $order->user_id]); //减积分
  91. if ($rel) {
  92. $order->paid_at = 1;
  93. $order->paid_time = strtotime($this->param['time_end']);
  94. $order->paid_no = $this->param['goodpay_order'];
  95. $order->save();
  96. }
  97. return 'SUCCESS';
  98. }
  99. /**
  100. * 活动商品微信支付
  101. * @return void
  102. */
  103. public function sale(){
  104. $order = model('Order')->where(['order_no' => $this->param['out_trade_no'],'paid_at' => 0])->find();
  105. if (empty($order)){
  106. return 'SUCCESS';
  107. }
  108. $order->paid_at = 1;
  109. $order->paid_time = strtotime($this->param['time_end']);
  110. $order->paid_no = $this->param['goodpay_order'];
  111. $order->save();
  112. //减库存
  113. model('Sale')->where(['id' => $order->sale_id])->setDec('sale_nums', 1);
  114. //计算委托人收益
  115. widget('order/rebate', ['miniapp_id' =>$this->miniapp_id,'order_no' => $order->order_no,'item_id' => 0,'uid' => $order->user_id,'config' => $this->config]);
  116. //奖励计算
  117. $param = ['miniapp_id' =>$this->miniapp_id,'order'=> $order,'uid' => $order->user_id,'config' => $this->config];
  118. if ($this->config->reward_types) {
  119. widget('Reward/performance', $param);
  120. widget('Reward/range',$param);
  121. } else {
  122. widget('Reward/level',$param);
  123. }
  124. widget('Reward/agent',$param); //计算代理
  125. model('BankLogs')->add($this->miniapp_id, $order->user_id, -($order->order_amount*100), '¥'.money(-$order->order_amount).'微信支付,单号('.$order->order_no.')', $order->user_id, $order->order_no);
  126. return 'SUCCESS';
  127. }
  128. /**
  129. * 活动商品积分支付
  130. * @return void
  131. */
  132. public function salePoint(){
  133. $order = model('Order')->where(['order_no' => $this->param['out_trade_no'],'paid_at' => 0])->find();
  134. if (empty($order)){
  135. return 'SUCCESS';
  136. }
  137. //读取配置
  138. $rel = widget('order/pointPay', ['miniapp_id' => $this->miniapp_id,'cash_fee'=> money($order->order_amount),'uid' => $order->user_id,'config' => $this->config]);
  139. if ($rel) {
  140. $order->paid_at = 1;
  141. $order->is_point = 1;
  142. $order->paid_time = strtotime($this->param['time_end']);
  143. $order->paid_no = $this->param['goodpay_order'];
  144. $order->save();
  145. model('Sale')->where(['id' => $order['sale_id']])->setDec('sale_nums', 1);
  146. //计算委托人收益
  147. widget('order/rebate', ['miniapp_id' => $this->miniapp_id,'order_no' => $order->order_no,'item_id' => 0,'uid' => $order->user_id,'config' => $this->config]);
  148. //计算其他人的收益
  149. $param = ['miniapp_id' =>$this->miniapp_id,'order' => $order,'uid' => $order->user_id,'config' => $this->config];
  150. if ($this->config->reward_types) {
  151. widget('Reward/performance',$param);
  152. widget('Reward/range',$param);
  153. } else {
  154. widget('Reward/level',$param);
  155. }
  156. widget('Reward/agent', $param);
  157. model('BankLogs')->add($this->miniapp_id, $order->user_id,-($order->order_amount*100),'¥'.money(-$order->order_amount).'余额支付,单号('.$order->order_no.')', $order->user_id, $order->order_no);
  158. return 'SUCCESS';
  159. }
  160. return 'FAIL';
  161. }
  162. /**
  163. * 抢购微信支付(提货)
  164. * @return void
  165. */
  166. public function resetSale(){
  167. $order = Shopping::where(['paid_at' => 0,'order_no' => $this->param['out_trade_no']])->find();
  168. if(empty($order)){
  169. return 'SUCCESS';
  170. }
  171. model('EntrustList')->where(['item_id' => $order->orderItem->item_id,'user_id' => $order->user_id,'is_rebate' => 0,'is_under' => 0])->update(['is_rebate' => 1,'is_under' => 1,'rebate' => 0,'update_time' => $order->paid_time]);
  172. $order->paid_at = 1;
  173. $order->paid_time = strtotime($this->param['time_end']);
  174. $order->paid_no = $this->param['goodpay_order'];
  175. $order->save();
  176. return 'SUCCESS';
  177. }
  178. /**
  179. * 抢购微信支付(提货)
  180. * @return void
  181. */
  182. public function resetSalePoint(){
  183. $order = Shopping::where(['paid_at' => 0,'order_no' => $this->param['out_trade_no']])->find();
  184. if(empty($order)){
  185. return 'SUCCESS';
  186. }
  187. $rel = widget('order/shopPointPay', ['miniapp_id' => $this->miniapp_id,'cash_fee'=> $order->order_amount,'uid' => $order->user_id]); //减积分
  188. if ($rel) {
  189. model('EntrustList')->where(['item_id' => $order->orderItem->item_id,'user_id' => $order->user_id,'is_rebate' => 0,'is_under' => 0])->update(['is_rebate' => 1,'is_under' => 1,'rebate' => 0,'update_time' => $order->paid_time]);
  190. $order->paid_at = 1;
  191. $order->paid_time = strtotime($this->param['time_end']);
  192. $order->paid_no = $this->param['goodpay_order'];
  193. $order->save();
  194. return 'SUCCESS';
  195. }
  196. return 'FAIL';
  197. }
  198. /**
  199. * 充值
  200. * @return void
  201. */
  202. public function recharge(){
  203. $order = model('BankCash')->re_table()->where(['order_no' => $this->param['out_trade_no'],'state' => 0])->find();
  204. if (empty($order)){
  205. return 'SUCCESS';
  206. }
  207. $order->state = 1;
  208. $order->paid_time = strtotime($this->param['time_end']);
  209. $order->paid_no = $this->param['goodpay_order'];
  210. $order->save();
  211. model('Bank')->recharge($this->miniapp_id,$order->user_id,$order->money);
  212. model('BankLogs')->add($this->miniapp_id,$order->user_id,intval($order->money*100),'充值¥'.money($order->money).'('.$order->order_no.')');
  213. return 'SUCCESS';
  214. }
  215. /**
  216. * 开通会员
  217. * @return void
  218. */
  219. public function openVip(){
  220. $order = Vip::where(['state' => 0,'order_no' => $this->param['out_trade_no']])->find();
  221. if (empty($order)){
  222. return 'SUCCESS';
  223. }
  224. $order->state = 1;
  225. $order->paid_time = strtotime($this->param['time_end']);
  226. $order->paid_no = $this->param['goodpay_order'];
  227. $order->save();
  228. widget('vip/level', ['miniapp_id' =>$this->miniapp_id,'cash_fee'=> $this->param['cash_fee'],'uid' => $order->user_id]);
  229. return 'SUCCESS';
  230. }
  231. }