PayHelper.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?php
  2. namespace App\Helper;
  3. use Omnipay\Omnipay;
  4. use App\Models\OrderInfoModel;
  5. use Config, Request,QrCode;
  6. trait PayHelper
  7. {
  8. private function prepare() {
  9. // Pingpp::setApiKey(env('PINGPP_APP_KEY'));
  10. // Pingpp::setPrivateKeyPath(config_path() . 'ppp_pri_key.pem');
  11. }
  12. /**
  13. * 验签
  14. * @param $data
  15. * @param $sig
  16. * @return int
  17. */
  18. public function checkPppSignature($data, $sig) {
  19. $pubKey = file_get_contents(config_path() . 'ppp_pub_key.pem');
  20. return openssl_verify($data, $sig, $pubKey, 'sha256');
  21. }
  22. private function saveOrder($data) {
  23. $order = new OrderInfoModel();
  24. $order->code = $data['code'];
  25. $order->transaction_id = $data['transaction_id'];
  26. $order->user_type = $data['user_type'];
  27. $order->user_id = $data['user_id'];
  28. $order->goods_type = $data['goods'];
  29. $order->goods_id = $data['goods_id'];
  30. $order->price = $data['price'];
  31. $order->number = $data['number'];
  32. $order->amount = $data['amount'];
  33. $order->pay_type = $data['pay_type'];
  34. if (isset($data['ext_info'])) {
  35. $order->ext_info = $data['ext_info'];
  36. }
  37. if ($order->save()) {
  38. return $order->find($order->id);
  39. }
  40. return false;
  41. }
  42. public function createAlipayCharge($data, $profile = 'alipay') {
  43. $gateways = Config::get('laravel-omnipay.gateways');
  44. if (array_key_exists($profile, $gateways)) {
  45. $config = $gateways[$profile];
  46. } else {
  47. \Log::error('alipay: 不支持的支付类型, ' . $profile);
  48. return false;
  49. }
  50. $gateway = Omnipay::create($config['driver']);
  51. $gateway->setEnvironment($config['options']['environment']);
  52. $gateway->setAppId($config['options']['appid']);
  53. $gateway->setEncryptKey($config['options']['encrypt_key']);
  54. $gateway->setPrivateKey($config['options']['prikey']);
  55. $gateway->setAlipayPublicKey($config['options']['ali_pubkey']);
  56. $gateway->setNotifyUrl($config['options']['notify_url']);
  57. $goodsTypes = OrderInfoModel::getAllGoodsTypes();
  58. if (!isset($data['subject'])) {
  59. $data['subject'] = sprintf("甲象联合%s充值%d", $goodsTypes[$data['goods']], $data['number']);
  60. }
  61. if (!isset($data['goods_id'])) {
  62. $data['goods_id'] = 0;
  63. }
  64. $data['transaction_id'] = date('YmdHis') . mt_rand(1000, 9999);
  65. $data['code'] = 'ALIPAY_' . $data['transaction_id'];
  66. $data['price'] = 1;
  67. $data['amount'] = $data['number'] * $data['price']*100;
  68. $data['pay_type'] = OrderInfoModel::PAY_TYPE_ALIPAY;
  69. $request = $gateway->purchase();
  70. $request->setBizContent([
  71. 'subject' => $data['subject'],
  72. 'out_trade_no' => $data['transaction_id'],
  73. 'total_amount' => round($data['amount'] / 100, 2),
  74. 'product_code' => 'QUICK_MSECURITY_PAY',//固定值
  75. ]);
  76. if ($profile == 'alipay_f2f') {
  77. $request->setBizContent([
  78. 'subject' => $data['subject'],
  79. 'out_trade_no' => $data['transaction_id'],
  80. 'total_amount' => round($data['amount'] / 100, 2),
  81. ]);
  82. }
  83. // dd($request);
  84. $response = $request->send();
  85. if ($response->isSuccessful()) {
  86. if ($profile == 'alipay_app' || $profile == 'alipay') {
  87. $orderString = $response->getOrderString();
  88. }
  89. if ($profile == 'alipay_f2f') {
  90. $code_url = $response->getQrCode();
  91. $code_path = public_path('qrcodes/'.$data['code'].'.png');
  92. QrCode::format('png')->size(500)->generate($code_url,$code_path);
  93. $orderString = env('APP_URL').'/qrcodes/'.$data['code'].'.png';
  94. }
  95. \Log::info("支付宝生成订返回:".$orderString);
  96. //写订单
  97. $order = $this->saveOrder($data);
  98. if ($order !== false) {
  99. $result = $order->toArray();
  100. $result['orderString'] = $orderString;
  101. return $result;
  102. }
  103. \Log::error('save order failed');
  104. return false;
  105. } else {
  106. \Log::error('alipay response failed'.$response->getMessage());
  107. return false;
  108. }
  109. }
  110. public function createWechatpayCharge($data, $profile = 'wechatpay') {
  111. $gateways = Config::get('laravel-omnipay.gateways');
  112. if (array_key_exists($profile, $gateways)) {
  113. $config = $gateways[$profile];
  114. } else {
  115. \Log::error('wechatpay: 不支持的支付设置, ' . $profile);
  116. return false;
  117. }
  118. $gateway = Omnipay::create($config['driver']);
  119. // $gateway->setEnvironment('sandbox');
  120. $gateway->setAppId($config['options']['appid']);
  121. $gateway->setMchId($config['options']['merchant_id']);
  122. $gateway->setApiKey($config['options']['apikey']);
  123. $gateway->setNotifyUrl($config['options']['notify_url']);
  124. $goodsTypes = OrderInfoModel::getAllGoodsTypes();
  125. if (!isset($data['subject'])) {
  126. $data['subject'] = sprintf("甲象联合%s充值%d", $goodsTypes[$data['goods']], $data['number']);
  127. }
  128. if (!isset($data['goods_id'])) {
  129. $data['goods_id'] = 0;
  130. }
  131. $data['transaction_id'] = date('YmdHis') . mt_rand(1000, 9999);
  132. $data['code'] = 'WECHATPAY_' . $data['transaction_id'];
  133. $data['price'] = 1;
  134. $data['amount'] = $data['number'] * $data['price'];
  135. $data['pay_type'] = OrderInfoModel::PAY_TYPE_WECHATPAY;
  136. $order = [
  137. 'body' => $data['subject'],
  138. 'out_trade_no' => $data['transaction_id'],
  139. 'total_fee' => $data['amount']*100,
  140. 'spbill_create_ip' => Request::ip(),
  141. 'fee_type' => 'CNY'
  142. ];
  143. $request = $gateway->purchase($order);
  144. $response = $request->send();
  145. // dd($response);
  146. if ($response->isSuccessful()) {
  147. if ($profile == 'wechatpay_app' || $profile == 'wechatpay') {
  148. $orderString = $response->getAppOrderData();
  149. }
  150. if ($profile == 'wechatpay_native') {
  151. $code_url = $response->getCodeUrl();
  152. $code_path = public_path('qrcodes/'.$data['code'].'.png');
  153. QrCode::format('png')->size(500)->generate($code_url,$code_path);
  154. $orderString = env('APP_URL').'/qrcodes/'.$data['code'].'.png';
  155. }
  156. \Log::debug($orderString);
  157. //写订单
  158. $order = $this->saveOrder($data);
  159. if ($order !== false) {
  160. $result = $order->toArray();
  161. $result['orderString'] = $orderString;
  162. return $result;
  163. }
  164. \Log::error('save order failed');
  165. return false;
  166. } else {
  167. \Log::error($response->getData());
  168. return false;
  169. }
  170. //available methods
  171. // $response->isSuccessful();
  172. // $response->getData(); //For debug
  173. // $response->getAppOrderData(); //For WechatPay_App
  174. // $response->getJsOrderData(); //For WechatPay_Js
  175. // $response->getCodeUrl(); //For Native Trade Type
  176. }
  177. }