PayHelper.php 7.3 KB

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