Mike 7 năm trước cách đây
mục cha
commit
5c6ceec396

+ 6 - 6
miaomiao/www/js/controllers/account.js

xqd xqd
@@ -4,9 +4,9 @@
              //$ionicNavBarDelegate.showBackButton(false);
             $scope.wechat_login = function(){
                 var scope = "snsapi_userinfo", state = "_" + (+new Date());
-                Wechat.auth(scope, state, function (response) {
-                    alert("response:"+JSON.stringify(response));
-                     //response.code;
+                // Wechat.auth(scope, state, function (response) {
+                    // alert("response:"+JSON.stringify(response));
+                    var response={code:1231};
                     if(response.code){
                         msg.loading('登录中...');
                         userService.wechat_login(response.code).then(function(result){
@@ -26,9 +26,9 @@
                             $state.go("loginAccount",{wechat:$scope.wecaht});
                         });
                     }
-                }, function (error) {
-                    console("Failed: " + JSON.stringify(error));
-                });
+                // }, function (error) {
+                //     console.log("Failed: " + JSON.stringify(error));
+                // });
                 //$state.go("loginAccount");
             };
     }]);

+ 4 - 3
miaomiao/www/js/controllers/my.js

xqd
@@ -394,13 +394,14 @@
             };
            
       //充值
-      $scope.recharge = function(money){
-          if (!$scope.vm.money) {
+      $scope.charge = function(money){
+          if (!money) {
               msg.text('请输入充值金额');
               return;
           }
-          myService.recharge(money).then(function (result) {
+          myService.charge(money,2).then(function (result) {
               //todo:result需要返回支付宝或者微信的签名信息
+              console.log("result: " + JSON.stringify(result));
               var payInfo = result.data;
               if ($scope.vm.payType == 1) { //支付宝
                   cordova.plugins.AliPay.pay(payInfo, function success(e) {

+ 1 - 1
miaomiao/www/js/services/httpinterceptor.js

xqd
@@ -30,7 +30,7 @@
                 return response;
             },
             'responseError': function (rejection) {
-                // console.log(JSON.stringify(rejection));
+                console.log(JSON.stringify(rejection));
                 if (rejection.status == 401||rejection.data.message=="Unauthenticated.") {
                     storage.remove('user');
                     storage.remove('token');

+ 4 - 3
miaomiao/www/js/services/myservice.js

xqd
@@ -14,10 +14,11 @@
                     data: { password: password }
                 })
             },
-            recharge:function(money){
+            charge:function(coin,type){
                 return $http({
-                    url:config.server + "api/my/recharge?coin="+money,
-                    method:"post"
+                    url:config.server + "api/pay/charge",
+                    method:"post",
+                    data: { coin:coin,goods:1,type:type}
                 })
             },
             setting:function(){

+ 3 - 3
miaomiao/www/templates/my/my-recharge.html

xqd xqd
@@ -21,8 +21,8 @@
                 </div>
             </div>
             <div class="item item-input" style="padding-top: 20px; padding-bottom: 20px">
-                <span class="input-label" style="width: 60px">金额</span>
-                <input type="number" placeholder="请输入充值金额" ng-model="vm.money">
+                <span class="input-label" style="width: 60px">梦想币</span>
+                <input type="tel" placeholder="请输入数量" ng-model="vm.money">
             </div>
             <div class="item" style="color: #969696; padding-top: 40px">
                选择支付方式
@@ -39,7 +39,7 @@
             </ion-list>
         </div>
         <div class="padding">
-            <button  class="button button-block button-calm" ng-click="recharge(vm.money)">
+            <button  class="button button-block button-calm" ng-click="charge(vm.money)">
                 支付
             </button>
         </div>

+ 198 - 0
server/app/Helper/PayHelper.php

xqd
@@ -0,0 +1,198 @@
+<?php
+namespace App\Helper;
+
+use Omnipay\Omnipay;
+use App\Models\OrderInfoModel;
+use Config, Request,QrCode;
+
+trait PayHelper
+{
+    private function prepare() {
+//        Pingpp::setApiKey(env('PINGPP_APP_KEY'));
+//        Pingpp::setPrivateKeyPath(config_path() . 'ppp_pri_key.pem');
+    }
+
+    /**
+     * 验签
+     * @param $data
+     * @param $sig
+     * @return int
+     */
+    public function checkPppSignature($data, $sig) {
+        $pubKey = file_get_contents(config_path() . 'ppp_pub_key.pem');
+        return openssl_verify($data, $sig, $pubKey, 'sha256');
+    }
+
+    private function saveOrder($data) {
+        $order = new OrderInfoModel();
+        $order->code            = $data['code'];
+        $order->transaction_id  = $data['transaction_id'];
+        $order->user_type       = $data['user_type'];
+        $order->user_id         = $data['user_id'];
+        $order->goods_type      = $data['goods'];
+        $order->goods_id        = $data['goods_id'];
+        $order->price           = $data['price'];
+        $order->number          = $data['number'];
+        $order->amount          = $data['amount'];
+        $order->pay_type        = $data['pay_type'];
+        if (isset($data['ext_info'])) {
+            $order->ext_info = $data['ext_info'];
+        }
+
+        if ($order->save()) {
+            return $order->find($order->id);
+        }
+        return false;
+    }
+
+    public function createAlipayCharge($data, $profile = 'alipay') {
+        $gateways = Config::get('laravel-omnipay.gateways');
+        if (array_key_exists($profile, $gateways)) {
+            $config = $gateways[$profile];
+        } else {
+            \Log::error('alipay: 不支持的支付类型, ' . $profile);
+            return false;
+        }
+        $gateway = Omnipay::create($config['driver']);
+        $gateway->setEnvironment($config['options']['environment']);
+        $gateway->setAppId($config['options']['appid']);
+        $gateway->setEncryptKey($config['options']['encrypt_key']);
+        $gateway->setPrivateKey($config['options']['prikey']);
+        $gateway->setAlipayPublicKey($config['options']['ali_pubkey']);
+        $gateway->setNotifyUrl($config['options']['notify_url']);
+
+        $goodsTypes = OrderInfoModel::getAllGoodsTypes();
+        if (!isset($data['subject'])) {
+            $data['subject'] = sprintf("甲象联合%s充值%d", $goodsTypes[$data['goods']], $data['number']);
+        }
+        if (!isset($data['goods_id'])) {
+            $data['goods_id'] = 0;
+        }
+        $data['transaction_id'] = date('YmdHis') . mt_rand(1000, 9999);
+        $data['code'] = 'ALIPAY_' . $data['transaction_id'];
+        $data['price'] = 1;
+        $data['amount'] = $data['number'] * $data['price']*100;
+        $data['pay_type'] = Order::PAY_TYPE_ALIPAY;
+
+        $request = $gateway->purchase();
+        $request->setBizContent([
+            'subject'      => $data['subject'],
+            'out_trade_no' => $data['transaction_id'],
+            'total_amount' => round($data['amount'] / 100, 2),
+            'product_code' => 'QUICK_MSECURITY_PAY',//固定值
+        ]);
+        if ($profile == 'alipay_f2f') {
+            $request->setBizContent([
+                'subject'      => $data['subject'],
+                'out_trade_no' => $data['transaction_id'],
+                'total_amount' => round($data['amount'] / 100, 2),
+            ]);
+        }
+//        dd($request);
+
+        $response = $request->send();
+
+        if ($response->isSuccessful()) {
+            if ($profile == 'alipay_app' || $profile == 'alipay') {
+                $orderString = $response->getOrderString();
+            }
+            if ($profile == 'alipay_f2f') {
+                $code_url = $response->getQrCode();
+                $code_path = public_path('qrcodes/'.$data['code'].'.png');
+                QrCode::format('png')->size(500)->generate($code_url,$code_path);
+                $orderString =  env('APP_URL').'/qrcodes/'.$data['code'].'.png';
+            }
+            \Log::info("支付宝生成订返回:".$orderString);
+
+            //写订单
+            $order = $this->saveOrder($data);
+            if ($order !== false) {
+                $result = $order->toArray();
+                $result['orderString'] = $orderString;
+                return $result;
+            }
+            \Log::error('save order failed');
+            return false;
+        } else {
+            \Log::error('alipay response failed'.$response->getMessage());
+            return false;
+        }
+    }
+
+    public function createWechatpayCharge($data, $profile = 'wechatpay') {
+        $gateways = Config::get('laravel-omnipay.gateways');
+        if (array_key_exists($profile, $gateways)) {
+            $config = $gateways[$profile];
+        } else {
+            \Log::error('wechatpay: 不支持的支付设置, ' . $profile);
+            return false;
+        }
+
+        $gateway = Omnipay::create($config['driver']);
+//        $gateway->setEnvironment('sandbox');
+        $gateway->setAppId($config['options']['appid']);
+        $gateway->setMchId($config['options']['merchant_id']);
+        $gateway->setApiKey($config['options']['apikey']);
+        $gateway->setNotifyUrl($config['options']['notify_url']);
+
+        $goodsTypes = Order::getAllGoodsTypes();
+        if (!isset($data['subject'])) {
+            $data['subject'] = sprintf("甲象联合%s充值%d", $goodsTypes[$data['goods']], $data['number']);
+        }
+        if (!isset($data['goods_id'])) {
+            $data['goods_id'] = 0;
+        }
+        $data['transaction_id'] = date('YmdHis') . mt_rand(1000, 9999);
+        $data['code'] = 'WECHATPAY_' . $data['transaction_id'];
+        $data['price'] = 1;
+        $data['amount'] = $data['number'] * $data['price'];
+        $data['pay_type'] = Order::PAY_TYPE_WECHATPAY;
+
+        $order = [
+            'body'              => $data['subject'],
+            'out_trade_no'      => $data['transaction_id'],
+            'total_fee'         => $data['amount']*100,
+            'spbill_create_ip'  => Request::ip(),
+            'fee_type'          => 'CNY'
+        ];
+
+        $request  = $gateway->purchase($order);
+        $response = $request->send();
+
+//        dd($response);
+
+        if ($response->isSuccessful()) {
+            if ($profile == 'wechatpay_app' || $profile == 'wechatpay') {
+                $orderString = $response->getAppOrderData();
+            }
+            if ($profile == 'wechatpay_native') {
+                $code_url = $response->getCodeUrl();
+                $code_path = public_path('qrcodes/'.$data['code'].'.png');
+                QrCode::format('png')->size(500)->generate($code_url,$code_path);
+                $orderString =  env('APP_URL').'/qrcodes/'.$data['code'].'.png';
+            }
+            \Log::debug($orderString);
+
+            //写订单
+            $order = $this->saveOrder($data);
+            if ($order !== false) {
+                $result = $order->toArray();
+                $result['orderString'] = $orderString;
+                return $result;
+            }
+            \Log::error('save order failed');
+            return false;
+        } else {
+            \Log::error($response->getData());
+            return false;
+        }
+
+        //available methods
+//        $response->isSuccessful();
+//        $response->getData(); //For debug
+//        $response->getAppOrderData(); //For WechatPay_App
+//        $response->getJsOrderData(); //For WechatPay_Js
+//        $response->getCodeUrl(); //For Native Trade Type
+    }
+
+}

+ 9 - 18
server/app/Http/Controllers/Api/V1/PayController.php

xqd xqd xqd xqd
@@ -2,14 +2,11 @@
 
 namespace App\Http\Controllers\Api\V1;
 
-use App\Http\HelperTraits\LogHelper;
-use App\Http\HelperTraits\PayHelper;
-use App\Http\HelperTraits\JpushHelper;
-use Omnipay\Omnipay;
+use App\Helper\PayHelper;
 use App\User;
-use App\Models\MerchantMemberService;
-use App\Models\Order;
+use App\Models\OrderInfoModel;
 use App\Models\AccountLog;
+use App\Services\Base\ErrorCode;
 use Request, Config, DB;
 
 class PayController extends Controller
@@ -289,7 +286,7 @@ class PayController extends Controller
      * @apiGroup Merchant
      * @apiPermission Passport
      * @apiVersion 0.1.0
-     * @apiParam {int}  [goods=1]   充值商品(1:余额,2:卡金
+     * @apiParam {int}  [goods=1]   充值商品(1:梦想币
      * @apiParam {int}  number      充值数量,人民币,以分表示
      * @apiParam {int}  type        支付类型(1:支付宝,2:微信支付)
      * @apiSuccessExample {json} Success-Response:
@@ -325,13 +322,12 @@ class PayController extends Controller
      * }
      * 可能出现的错误代码:
      * 1000    CLIENT_WRONG_PARAMS             传入参数不正确
-     * 1300    MERCHANT_NOT_EXIST              商户不存在
      */
     public function charge(Request $request)
     {
-        $goodsTypes = Order::getAllGoodsTypes();
+        $goodsTypes = OrderInfoModel::getAllGoodsTypes();
         $gTypes = array_keys($goodsTypes);
-        $payTypes = Order::getAllPayTypes();
+        $payTypes = OrderInfoModel::getAllPayTypes();
         $pTypes = array_keys($payTypes);
         $validator = Validator::make($data = $request->input(),
             [
@@ -354,18 +350,13 @@ class PayController extends Controller
         }
 
         $user = Auth::user();
-        $merchant = Merchant::where('user_id', '=', $user->id)->first();//模型支持单用户多商户,业务只设计单商户
-        if (!$merchant) {
-            return $this->error(ErrorCode::MERCHANT_NOT_EXIST);
-        }
-
         $data['goods_id'] = 0;
         if (!isset($data['goods'])) {//默认充余额
-            $data['goods'] = Order::GOODS_TYPE_BALANCE;
+            $data['goods'] = OrderInfoModel::GOODS_TYPE_COIN;
         }
 
-        $data['user_type'] = Order::USER_TYPE_MERCHANT;
-        $data['user_id'] = $user->id;//$merchant->id;
+        $data['user_type'] = OrderInfoModel::USER_TYPE_USER;
+        $data['user_id'] = $user->id;
         if ($data['type'] == Order::PAY_TYPE_ALIPAY) {
             $result = $this->createAlipayCharge($data);
         } else {

+ 64 - 0
server/app/Models/OrderInfoModel.php

xqd
@@ -0,0 +1,64 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class OrderInfoModel extends Model
+{
+    //
+
+    //用户类型定义
+    const USER_TYPE_USER    = 1;
+
+    //用户类型枚举
+    private static $_user_types = [
+        self::USER_TYPE_USER    => '会员',
+    ];
+
+    //商品类型定义
+    const GOODS_TYPE_COIN  = 1;
+//    const GOODS_TYPE_COSUME   = 3;
+
+    //商品类型枚举
+    private static $_goods_types = [
+        self::GOODS_TYPE_COIN    => '梦想币',
+//        self::GOODS_TYPE_COSUME     => '续消现金',
+    ];
+
+    //支付类型定义
+    const PAY_TYPE_ALIPAY     = 1;
+    const PAY_TYPE_WECHATPAY  = 2;
+
+    //支付类型枚举
+    private static $_pay_types = [
+        self::PAY_TYPE_ALIPAY       => '支付宝',
+        self::PAY_TYPE_WECHATPAY    => '微信支付',
+//        self::PAY_TYPE_UNIONPAY     => '银联支付',
+    ];
+
+    //订单状态定义
+    const STATUS_PENDING    = 0;
+    const STATUS_FINISHED   = 1;
+    const STATUS_CANCELED   = 2;
+
+    //订单状态枚举
+    private static $_status = [
+        self::STATUS_PENDING    => '待处理',
+        self::STATUS_FINISHED   => '已完成',
+        self::STATUS_CANCELED   => '已取消',
+    ];
+
+
+    public static function getAllGoodsTypes() {
+        return self::$_goods_types;
+    }
+
+    public static function getAllStatus() {
+        return self::$_status;
+    }
+
+    public static function getAllPayTypes() {
+        return self::$_pay_types;
+    }
+}

+ 1 - 1
server/app/Models/UserInfoModel.php

xqd
@@ -1,6 +1,6 @@
 <?php
 namespace App\Models;
-use App\Models\BaseModel;
+
 use Illuminate\Foundation\Auth\User as Authenticatable;
 use Laravel\Passport\HasApiTokens;
 use Illuminate\Notifications\Notifiable;

+ 3 - 0
server/composer.json

xqd
@@ -15,6 +15,9 @@
         "laravel/tinker": "~1.0",
         "orangehill/iseed": "^2.4",
         "php-ffmpeg/php-ffmpeg": "^0.9.5",
+        "ignited/laravel-omnipay": "2.*",
+        "lokielse/omnipay-alipay": "^2.0",
+        "lokielse/omnipay-wechatpay": "^1.0",
         "simplesoftwareio/simple-qrcode": "1.5.*"
     },
     "require-dev": {

+ 3 - 0
server/config/app.php

xqd xqd
@@ -181,6 +181,7 @@ return [
         Laravel\Passport\PassportServiceProvider::class,
         Dingo\Api\Provider\LaravelServiceProvider::class,
         Orangehill\Iseed\IseedServiceProvider::class,
+        Ignited\LaravelOmnipay\LaravelOmnipayServiceProvider::class,
         SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class,
 
     ],
@@ -231,6 +232,8 @@ return [
         'URL' => Illuminate\Support\Facades\URL::class,
         'Validator' => Illuminate\Support\Facades\Validator::class,
         'View' => Illuminate\Support\Facades\View::class,
+
+        'Omnipay' => Ignited\LaravelOmnipay\Facades\OmnipayFacade::class,
         'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class
     ],
 

+ 52 - 0
server/database/migrations/2017_05_30_113210_create_orders_table.php

xqd
@@ -0,0 +1,52 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+/**
+ * Migration auto-generated by Sequel Pro Laravel Export
+ * @see https://github.com/cviebrock/sequel-pro-laravel-export
+ */
+class CreateOrdersTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('orders', function (Blueprint $table) {
+            $table->increments('id');
+            $table->string('code', 50)->comment('订单流水号');
+            $table->string('transaction_id', 255)->nullable()->comment('交易流水号');
+            $table->unsignedInteger('user_id')->comment('用户id');
+            $table->unsignedInteger('goods_id')->default(1)->comment('商品id:1梦想币');
+            $table->unsignedInteger('price')->default(1)->comment('商品单价');
+            $table->unsignedInteger('number')->default(1)->comment('商品数量');
+            $table->unsignedInteger('amount')->comment('交易金额');
+            $table->tinyInteger('pay_type')->default(1)->comment('支付类型,1:支付宝,2:微信支付,3:银联卡');
+            $table->tinyInteger('status')->comment('订单状态:0,待处理,1,已完成,2,已取消');
+            $table->string('ext_info', 255)->nullable();
+            $table->nullableTimestamps();
+
+            $table->index('code', 'idx_code');
+            $table->index('transaction_id', 'idx_tid');
+            $table->index(['user_type', 'user_id'], 'idx_user');
+
+            
+
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('orders');
+    }
+}