hrjy il y a 2 ans
Parent
commit
22982859a3

+ 2 - 1
app/admin/controller/user/User.php

@@ -419,7 +419,8 @@ class User extends AuthController
         }
         $res_sp = true;
         if ($data['spread_uid'] != $user['spread_uid']) {
-            $res_sp = \app\models\user\User::setSpread($data['spread_uid'], $uid);
+//            $res_sp = \app\models\user\User::setSpread($data['spread_uid'], $uid);
+            $edit['spread_uid'] = $data['spread_uid'];
         }
         $edit['status'] = $data['status'];
         $edit['real_name'] = $data['real_name'];

+ 1 - 1
app/api/controller/AuthController.php

@@ -457,7 +457,7 @@ class AuthController
      */
     public function app_auth(Request $request)
     {
-        Db::query("DELETE from eb_wechat_user where uid not in (select uid from eb_user)");
+//        Db::query("DELETE from eb_wechat_user where uid not in (select uid from eb_user)");
         $cache_key = '';
         $userInfo = UtilService::postMore([
             ['openId', ''],

+ 3 - 0
app/api/controller/order/StoreOrderController.php

@@ -364,6 +364,9 @@ class StoreOrderController
                     return app('json')->fail(is_array($error) && isset($error['msg']) ? $error['msg'] : $error);
                 }
                 break;
+            case 'app':
+                $res =  StoreOrder::appPay($order, $request->uid());
+                break;
             case 'offline':
                 StoreOrder::createOrderTemplate($order);
                 if (StoreOrder::setOrderTypePayOffline($order['order_id']))

+ 44 - 0
app/http/validates/user/RestValidates.php

@@ -0,0 +1,44 @@
+<?php
+namespace app\http\validates\user;
+
+
+use think\Validate;
+
+/**
+ * 注册验证
+ * Class RegisterValidates
+ * @package app\http\validates\user
+ */
+class RestValidates extends Validate
+{
+    protected $regex = [ 'phone' => '/^1[3456789]\d{9}$/'];
+
+    protected $rule = [
+        'phone'  =>  'require|regex:phone',
+        'account'  =>  'require|regex:phone',
+        'captcha'  =>  'require|length:6',
+        'password'  =>  'require',
+    ];
+
+    protected $message  =   [
+        'phone.require'     =>  '手机号必须填写',
+        'phone.regex'       =>  '手机号格式错误',
+        'account.require'   =>  '手机号必须填写',
+        'account.regex'     =>  '手机号格式错误',
+        'captcha.require'   =>  '验证码必须填写',
+        'captcha.length'    =>  '验证码不能超过6个字符',
+        'password.require'  =>  '密码必须填写',
+    ];
+
+
+    public function sceneCode()
+    {
+        return $this->only(['phone']);
+    }
+
+
+    public function sceneRegister()
+    {
+        return $this->only(['account','captcha','password','payment_pas']);
+    }
+}

+ 66 - 1
app/models/store/StoreOrder.php

@@ -9,6 +9,7 @@ namespace app\models\store;
 
 use app\admin\model\system\ShippingTemplatesFree;
 use app\admin\model\system\ShippingTemplatesRegion;
+use app\phpPay\AopClient;
 use crmeb\basic\BaseModel;
 use think\db\exception\DataNotFoundException;
 use think\db\exception\DbException;
@@ -17,6 +18,7 @@ use think\facade\Cache;
 use crmeb\traits\ModelTrait;
 use think\facade\Log;
 use app\models\system\SystemStore;
+use app\models\store\StoreProduct;
 use app\models\routine\RoutineTemplate;
 use app\models\user\{User, UserAddress, UserBill, UserSpread, WechatUser};
 use crmeb\services\{
@@ -324,6 +326,9 @@ class StoreOrder extends BaseModel
                 if (!$seckill_id) $seckill_id = $cart['seckill_id'];
                 if (!$bargain_id) $bargain_id = $cart['bargain_id'];
                 if (!$combinationId) $combinationId = $cart['combination_id'];
+                $storeProduct = StoreProduct::where('id',$cart['productInfo']['id'])->find();
+                if($storeProduct['cate_id'] == 4 and $useIntegral)return self::setErrorInfo('该商品不能抵扣', true);
+                // if ($cart['productInfo']['cate_id'] == 4 and $useIntegral) return self::setErrorInfo('该商品不能抵扣', true);
                 $cartInfoGainIntegral = isset($cart['productInfo']['give_integral']) ? bcmul($cart['cart_num'], $cart['productInfo']['give_integral'], 2) : 0;
                 $whiteInfoGainIntegral = isset($cart['productInfo']['white_integral']) ? bcmul($cart['cart_num'], $cart['productInfo']['white_integral'], 2) : 0;
                 $businessGainIntegral = isset($cart['productInfo']['business_integral']) ? bcmul($cart['cart_num'], $cart['productInfo']['business_integral'], 2) : 0;
@@ -379,7 +384,6 @@ class StoreOrder extends BaseModel
                     return self::setErrorInfo('请选择门店', true);
                 }
             }
-
             //积分抵扣
             $res2 = true;
             $SurplusIntegral = $userInfo['integral'];
@@ -692,6 +696,65 @@ class StoreOrder extends BaseModel
         return $res;
     }
 
+    /**
+     * 微信支付 为 0元时
+     * @param $order_id
+     * @param $uid
+     * @param string $formId
+     * @return bool
+     * @throws \think\Exception
+     * @throws DataNotFoundException
+     * @throws ModelNotFoundException
+     * @throws \think\exception\DbException
+     */
+    public static function appPay($order, $uid, $formId = '')
+    {
+        $privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAL8qMJyWMB0irskcrt6cZ1iCu8F0jwIXMlK3julf8oRjkzh0DS14f3YtVPJSjcIQE/5HxFE6q0zybzw6HeF5PdfLgqkxBHbUpVzQOxl/VlHlsID3TH4RA3/VMJlwb0gvf8jBhZLGW2RB8fs5wB/9oihsNUEMC/hheucET0sPUdKjAgMBAAECgYAk0eyBDJCB3B9MT0EDUZ66NpwRW/D7lxozQnW9T6S3iTJfCkNLgc0TJxIYhnwVZ+Fh9dLDToiWDpAMSqlct2yIocRgHQGuTVcHTcHgy7OAYBTByduOv2wyW3k04c6jFlBGjq6n5vzJ2d4PWo2LRUTEd6y3g9P+uH/p7hNZENs6iQJBAOLIt8E/7SPp/EI5HNPlUvttFu7+9Jdi0KYaA7VtHUiWaJBdOTXF6jYqI7+kzs0F5C0ndSS4Xq1cS/upKqREw7UCQQDXysINwawLhVEVyBhr/4Zv/WikEeZ2GZnLdZI98uDWvaIqRzmhXLHdYXtZzVJ4qoJBQr6wo+EpbdUjML2WYmP3AkEAiJlj7XgG69H9ixoBnjSMZjtQTAav5xuzF8mloDsoH1fRhdtRIW2j5Jo/TCkGE4JP7U7OBZ80D/H/Joe/0pBE3QJAHfM+S7p9rnuqbWOAQD0O46xAQcVaPzn+ZobC7WYwXp2jTErmbMb4yMkm3afpsmW3/mbNIKceMSnVUzUImz68sQJBAML2F+TD/OG0BH2d4LbyjSuHp/MZlQeZkogrkJ3rBPd6Alz9YGAMWDiI+lptAAMIM8Ih8LT5VzDiuqN2L+4eoz4=";
+        $sxfPublic = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjo1+KBcvwDSIo+nMYLeOJ19Ju4ii0xH66ZxFd869EWFWk/EJa3xIA2+4qGf/Ic7m7zi/NHuCnfUtUDmUdP0JfaZiYwn+1Ek7tYAOc1+1GxhzcexSJLyJlR2JLMfEM+rZooW4Ei7q3a8jdTWUNoak/bVPXnLEVLrbIguXABERQ0Ze0X9Fs0y/zkQFg8UjxUN88g2CRfMC6LldHm7UBo+d+WlpOYH7u0OTzoLLiP/04N1cfTgjjtqTBI7qkOGxYs6aBZHG1DJ6WdP+5w+ho91sBTVajsCxAaMoExWQM2ipf/1qGdsWmkZScPflBqg7m0olOD87ymAVP/3Tcbvi34bDfwIDAQAB";
+        $aopClient =  new AopClient();
+        $array = [
+            //业务参数
+            "mno"=> $order['order_id'], //商户编号
+            "ordNo"=> $order['order_id'], //商户订单号
+        ];
+        $reqBean = [
+            "orgId" => "46706760",
+            "reqData"=>$array,
+            "reqId" => $order['order_id'],
+            "signType" => "RSA",
+            "timestamp" => date("Y-m-d h:i:s"),
+            "version" => "1.0",
+        ];
+
+        $signContent = $aopClient->generateSign($reqBean,$privateKey);
+        $sign =["sign" => $signContent];
+        $reqStr = array_merge($reqBean, $sign);
+        $reqStr = json_encode($reqStr,320);
+        $requestUrl = 'https://openapi-test.tianquetech.com/order/jsapiScan';
+        $resp = $aopClient->curl($requestUrl, $reqStr);
+        $result = json_decode($resp,320);
+        halt($result);
+        $signResult = $result["sign"];
+        //  result.remove("sign");
+        unset($result["sign"]);
+        //  String resultStr = RSASignature.getOrderContent(result);
+
+        //sign
+        /// String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, privateKey));
+        $signContent = $aopClient->getSignContent($result);
+
+        $verify = $aopClient->verify($signContent, $signResult,$sxfPublic);
+        //组装加密串
+        if ($verify) {
+            echo("验签成功");
+        }else{
+            echo("验签失败");
+        }
+
+    }
+
+
+
     /**
      * 微信支付 为 0元时
      * @param $order_id
@@ -787,6 +850,8 @@ class StoreOrder extends BaseModel
         UserBill::expend('购买商品', $order['uid'], 'now_money', 'pay_money', $order['pay_price'], $order['id'], $now_money, '支付' . floatval($order['pay_price']) . '元购买商品');
         //支付成功后
         event('OrderPaySuccess', [$order, $formId]);
+        $res3 = StoreOrder::gainWhiteIntegral($order);
+        $res4 = StoreOrder::gainBusinessIntegral($order);
         User::where('uid', $order['uid'])->update(['effective' => 1]);
         $res = $res1 && $resPink && UserSpread::setSpreadSure($order['uid']) && User::backOrderBrokerage($order);
         return false !== $res;

+ 3 - 1
app/models/user/WechatUser.php

@@ -276,6 +276,7 @@ class WechatUser extends BaseModel
         return $wechatInfo->toArray();
     }
 
+
     /**
      * 小程序创建用户后返回uid
      * @param $routineInfo
@@ -286,6 +287,7 @@ class WechatUser extends BaseModel
         $routineInfo['nickname'] = filter_emoji($routine['nickName']);//姓名
         $routineInfo['sex'] = $routine['gender'];//性别
         $routineInfo['city'] = $routine['city'];//城市
+        $routineInfo['language'] = 'zh_CN';//语言
         $routineInfo['province'] = $routine['province'];//省份
         $routineInfo['country'] = $routine['country'];//国家
         $routineInfo['headimgurl'] = $routine['avatarUrl'];//头像
@@ -302,7 +304,7 @@ class WechatUser extends BaseModel
             $routineInfo['isPromoter'] = $isCOde;
             if ($routine['login_type']) $routineInfo['login_type'] = $routine['login_type'];
             User::updateWechatUser($routineInfo, $uid);
-        } else if ($uid = self::where(['app_openid' => $routineInfo['openId']])->value('uid')) { //根据小程序openid判断
+        } else if ($uid = self::where(['routine_openid' => $routineInfo['routine_openid']])->value('uid')) { //根据小程序openid判断
             self::edit($routineInfo, $uid, 'uid');
             $routineInfo['code'] = $spid;
             $routineInfo['isPromoter'] = $isCOde;

+ 14 - 0
app/phpPay/.idea/deployment.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="PublishConfigData" serverName="demo">
+    <serverData>
+      <paths name="demo (1)">
+        <serverdata>
+          <mappings>
+            <mapping local="$PROJECT_DIR$" web="/" />
+          </mappings>
+        </serverdata>
+      </paths>
+    </serverData>
+  </component>
+</project>

+ 6 - 0
app/phpPay/.idea/misc.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="JavaScriptSettings">
+    <option name="languageLevel" value="ES6" />
+  </component>
+</project>

+ 8 - 0
app/phpPay/.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/php.pay.iml" filepath="$PROJECT_DIR$/.idea/php.pay.iml" />
+    </modules>
+  </component>
+</project>

+ 4 - 0
app/phpPay/.idea/php.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="PhpProjectSharedConfiguration" php_language_level="5.5.0" />
+</project>

+ 18 - 0
app/phpPay/.idea/webServers.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="WebServers">
+    <option name="servers">
+      <webServer id="5b4cd231-5ba0-4e68-80fa-4f426adba8f3" name="demo (1)" url="http://localhost/php.pay/">
+        <fileTransfer port="0" mountedRoot="D:\wamp\www\php.pay" accessType="MOUNT" />
+      </webServer>
+    </option>
+    <groups>
+      <group>
+        <name>demo</name>
+        <servers>
+          <name value="demo (1)" />
+        </servers>
+      </group>
+    </groups>
+  </component>
+</project>

+ 370 - 0
app/phpPay/.idea/workspace.xml

@@ -0,0 +1,370 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <list default="true" id="37c27695-b4ab-4809-8d91-2e0bce8dae06" name="Default Changelist" comment="" />
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="DefaultGradleProjectSettings">
+    <option name="isMigrated" value="true" />
+  </component>
+  <component name="FileEditorManager">
+    <leaf SIDE_TABS_SIZE_LIMIT_KEY="375" />
+  </component>
+  <component name="FindInProjectRecents">
+    <findStrings>
+      <find>拼接后</find>
+      <find>operationalType</find>
+      <find>openssl_verify</find>
+      <find>response</find>
+      <find>signdata</find>
+      <find>actNm</find>
+      <find>identityName</find>
+      <find>$alipaySdkVersion</find>
+      <find>支付宝</find>
+      <find>$gatewayUrl</find>
+      <find>$rsaPrivateKeyFilePath</find>
+      <find>rsaPublicKeyFilePath</find>
+      <find>$alipayPublicKey</find>
+      <find>alipayPublicKey</find>
+      <find>post_curls</find>
+      <find>openssl_get_publickey</find>
+      <find>alipayrsaPublicKey</find>
+      <find>rsaPrivateKey</find>
+      <find>format_secret_key</find>
+      <find>reqId</find>
+      <find>getJsonParam</find>
+      <find>rsaPrivateKeyFilePath</find>
+      <find>generateSign</find>
+      <find>rsaPublicKey</find>
+      <find>sign</find>
+      <find>verify</find>
+      <find>CURLFile</find>
+      <find>ENCRYPT_XML_NODE_NAME</find>
+      <find>merchantId</find>
+      <find>http</find>
+    </findStrings>
+    <replaceStrings>
+      <replace>mno</replace>
+    </replaceStrings>
+    <dirStrings>
+      <dir>D:\wamp\www\php.pay</dir>
+    </dirStrings>
+  </component>
+  <component name="IdeDocumentHistory">
+    <option name="CHANGED_PATHS">
+      <list>
+        <option value="$PROJECT_DIR$/wappay/service/AlipayTradeService.php" />
+        <option value="$PROJECT_DIR$/aop/request/AlipayTradeWapPayRequest.php" />
+        <option value="$PROJECT_DIR$/wappay/buildermodel/AlipayTradeWapPayContentBuilder.php" />
+        <option value="$PROJECT_DIR$/aop/AopClient.php" />
+        <option value="$PROJECT_DIR$/wappay/AlipayTradeService.php" />
+        <option value="$PROJECT_DIR$/wappay/pay1.php" />
+        <option value="$PROJECT_DIR$/wappay/query.php" />
+        <option value="$PROJECT_DIR$/wappay/refund.php" />
+        <option value="$PROJECT_DIR$/wappay/refundquery.php" />
+        <option value="$PROJECT_DIR$/app/public.key" />
+        <option value="$PROJECT_DIR$/wappay/pay.php" />
+        <option value="$PROJECT_DIR$/index.php" />
+        <option value="$PROJECT_DIR$/app/private.key" />
+        <option value="$PROJECT_DIR$/wappay/AopClient.php" />
+        <option value="$PROJECT_DIR$/readme.txt" />
+        <option value="$PROJECT_DIR$/wappay/AopEncrypt.php" />
+        <option value="$PROJECT_DIR$/wappay/TradeDemo.php" />
+        <option value="$PROJECT_DIR$/wappay/InCome.php" />
+        <option value="$PROJECT_DIR$/wappay/TradeActiveScan.php" />
+        <option value="$PROJECT_DIR$/wappay/TradeReverseScan.php" />
+        <option value="$PROJECT_DIR$/wappay/TradeJsApiScan.php" />
+        <option value="$PROJECT_DIR$/wappay/TradeRefund.php" />
+        <option value="$PROJECT_DIR$/wappay/TradeQuery.php" />
+        <option value="$PROJECT_DIR$/wappay/TradeRefundQuery.php" />
+        <option value="$PROJECT_DIR$/wappay/UpLoadPicture.php" />
+      </list>
+    </option>
+  </component>
+  <component name="JsFlowSettings">
+    <service-enabled>true</service-enabled>
+    <exe-path />
+    <other-services-enabled>true</other-services-enabled>
+    <auto-save>true</auto-save>
+  </component>
+  <component name="PhpServers">
+    <servers />
+  </component>
+  <component name="PhpWorkspaceProjectConfiguration" interpreter_name="PHP" />
+  <component name="ProjectFrameBounds" extendedState="6">
+    <option name="x" value="45" />
+    <option name="width" value="1400" />
+    <option name="height" value="820" />
+  </component>
+  <component name="ProjectView">
+    <navigator proportions="" version="1">
+      <foldersAlwaysOnTop value="true" />
+    </navigator>
+    <panes>
+      <pane id="Scope" />
+      <pane id="ProjectPane">
+        <subPane>
+          <expand>
+            <path>
+              <item name="phpPay" type="b2602c69:ProjectViewProjectNode" />
+              <item name="phpPay" type="462c0819:PsiDirectoryNode" />
+            </path>
+          </expand>
+          <select />
+        </subPane>
+      </pane>
+      <pane id="PackagesPane" />
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="aspect.path.notification.shown" value="true" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/wappay" />
+    <property name="node.js.detected.package.eslint" value="true" />
+    <property name="node.js.detected.package.tslint" value="true" />
+    <property name="node.js.path.for.package.eslint" value="project" />
+    <property name="node.js.path.for.package.tslint" value="project" />
+    <property name="node.js.selected.package.eslint" value="(autodetect)" />
+    <property name="node.js.selected.package.tslint" value="(autodetect)" />
+    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
+    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
+    <property name="settings.editor.selected.configurable" value="project.propDebugger" />
+  </component>
+  <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="E:\code\demo\phpPay\wappay" />
+    </key>
+  </component>
+  <component name="RunDashboard">
+    <option name="ruleStates">
+      <list>
+        <RuleState>
+          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
+        </RuleState>
+        <RuleState>
+          <option name="name" value="StatusDashboardGroupingRule" />
+        </RuleState>
+      </list>
+    </option>
+  </component>
+  <component name="RunManager">
+    <configuration name="index.php" type="JavascriptDebugType" nameIsGenerated="true" uri="http://localhost:63342/php.pay/index.php" useBuiltInWebServerPort="true">
+      <method v="2" />
+    </configuration>
+  </component>
+  <component name="SvnConfiguration">
+    <configuration />
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="37c27695-b4ab-4809-8d91-2e0bce8dae06" name="Default Changelist" comment="" />
+      <created>1583798157957</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1583798157957</updated>
+      <workItem from="1583798159125" duration="13819000" />
+      <workItem from="1583812241663" duration="14214000" />
+      <workItem from="1583827613300" duration="11863000" />
+      <workItem from="1583902796948" duration="6922000" />
+      <workItem from="1583919450785" duration="11663000" />
+      <workItem from="1583931237995" duration="2734000" />
+      <workItem from="1585883321143" duration="1547000" />
+      <workItem from="1585910573151" duration="1754000" />
+      <workItem from="1586007725130" duration="4982000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TimeTrackingManager">
+    <option name="totallyTimeSpent" value="73992000" />
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="-7" y="-7" width="1550" height="838" extended-state="6" />
+    <layout>
+      <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.24021593" />
+      <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
+      <window_info id="Favorites" order="2" side_tool="true" />
+      <window_info id="Image Layers" order="3" />
+      <window_info id="Designer" order="4" />
+      <window_info id="UI Designer" order="5" />
+      <window_info id="Capture Tool" order="6" />
+      <window_info anchor="bottom" id="Message" order="0" />
+      <window_info anchor="bottom" id="Find" order="1" sideWeight="0.49928367" weight="0.40053764" />
+      <window_info anchor="bottom" id="Run" order="2" />
+      <window_info anchor="bottom" id="Debug" order="3" weight="0.24865592" />
+      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
+      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
+      <window_info anchor="bottom" id="TODO" order="6" />
+      <window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
+      <window_info anchor="bottom" id="Version Control" order="8" />
+      <window_info anchor="bottom" id="Database Changes" order="9" />
+      <window_info anchor="bottom" id="PHP-CGI Server" order="10" />
+      <window_info anchor="bottom" id="Terminal" order="11" />
+      <window_info anchor="bottom" id="Event Log" order="12" sideWeight="0.5007163" side_tool="true" weight="0.40053764" />
+      <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
+      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
+      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
+      <window_info anchor="right" id="Database" order="3" />
+      <window_info anchor="right" id="Palette" order="4" />
+      <window_info anchor="right" id="Theme Preview" order="5" />
+      <window_info anchor="right" id="Maven" order="6" />
+      <window_info anchor="right" id="Capture Analysis" order="7" />
+      <window_info anchor="right" id="Palette&#9;" order="8" />
+    </layout>
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="1" />
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/aop/request/AlipayTradeWapPayRequest.php" />
+    <entry file="file://$PROJECT_DIR$/aop/test/TestImage.php" />
+    <entry file="file://$PROJECT_DIR$/aop/request/AlipaySecurityInfoAnalysisRequest.php" />
+    <entry file="file://$PROJECT_DIR$/aop/EncryptParseItem.php" />
+    <entry file="file://$PROJECT_DIR$/aop/EncryptResponseData.php" />
+    <entry file="file://$PROJECT_DIR$/aop/AlipayMobilePublicMultiMediaExecute.php" />
+    <entry file="file://$PROJECT_DIR$/wappay/service/AlipayTradeService.php" />
+    <entry file="file://$PROJECT_DIR$/aop/AopEncrypt.php" />
+    <entry file="file://$PROJECT_DIR$/aop/AlipayMobilePublicMultiMediaClient.php" />
+    <entry file="file://$PROJECT_DIR$/aop/SignData.php" />
+    <entry file="file://$PROJECT_DIR$/aop/AopClient.php" />
+    <entry file="file://$PROJECT_DIR$/wappay/pay1.php" />
+    <entry file="file://$PROJECT_DIR$/AopSdk.php" />
+    <entry file="file://$PROJECT_DIR$/config.php" />
+    <entry file="file://$PROJECT_DIR$/notify_url.php" />
+    <entry file="file://$PROJECT_DIR$/wappay/datadownioad.php" />
+    <entry file="file://$PROJECT_DIR$/wappay/AlipayMobilePublicMultiMediaClient.php" />
+    <entry file="file://$PROJECT_DIR$/lib/alipay_notify.class.php" />
+    <entry file="file://$PROJECT_DIR$/wappay/AlipayTradeService.php" />
+    <entry file="file://$PROJECT_DIR$/wappay/close.php" />
+    <entry file="file://$PROJECT_DIR$/wappay/refund.php" />
+    <entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/standard/standard_5.php" />
+    <entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/openssl/openssl.php" />
+    <entry file="file://$PROJECT_DIR$/app/public.key">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="95">
+          <caret line="5" column="24" lean-forward="true" selection-end-line="5" selection-end-column="24" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/query.php" />
+    <entry file="file://$PROJECT_DIR$/wappay/refundquery.php" />
+    <entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/json/json.php" />
+    <entry file="file://$PROJECT_DIR$/wappay/pay.php" />
+    <entry file="file://$PROJECT_DIR$/index.html" />
+    <entry file="file://$PROJECT_DIR$/app/private.key">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="19">
+          <caret line="1" selection-start-line="1" selection-end-line="25" selection-end-column="52" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/app/private - 副本.key" />
+    <entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/standard/standard_6.php" />
+    <entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/standard/standard_9.php" />
+    <entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/standard/standard_4.php" />
+    <entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/curl/curl.php" />
+    <entry file="file://$PROJECT_DIR$/log.txt" />
+    <entry file="file://$PROJECT_DIR$/readme.txt" />
+    <entry file="file://$PROJECT_DIR$/index.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-322">
+          <caret line="147" column="36" lean-forward="true" selection-start-line="147" selection-start-column="36" selection-end-line="147" selection-end-column="36" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/AopEncrypt.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1475">
+          <caret line="59" column="9" lean-forward="true" selection-start-line="59" selection-start-column="9" selection-end-line="59" selection-end-column="9" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/TradeReverseScan.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="200">
+          <caret line="8" column="29" lean-forward="true" selection-start-line="8" selection-start-column="29" selection-end-line="8" selection-end-column="29" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/TradeRefund.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="427">
+          <caret line="41" column="34" lean-forward="true" selection-start-line="41" selection-start-column="34" selection-end-line="41" selection-end-column="34" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/TradeQuery.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="250">
+          <caret line="10" column="18" lean-forward="true" selection-start-line="10" selection-start-column="18" selection-end-line="10" selection-end-column="18" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/TradeRefundQuery.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="275">
+          <caret line="11" column="45" lean-forward="true" selection-start-line="11" selection-start-column="45" selection-end-line="11" selection-end-column="45" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/TradeJsApiScan.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="352">
+          <caret line="70" column="41" lean-forward="true" selection-start-line="70" selection-start-column="41" selection-end-line="70" selection-end-column="41" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/EncryptParseItem.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="300">
+          <caret line="12" column="23" lean-forward="true" selection-start-line="12" selection-start-column="23" selection-end-line="12" selection-end-column="23" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/EncryptResponseData.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="225">
+          <caret line="9" column="27" lean-forward="true" selection-start-line="9" selection-start-column="27" selection-end-line="9" selection-end-column="27" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/UpLoadPicture.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="375">
+          <caret line="15" column="74" lean-forward="true" selection-start-line="15" selection-start-column="74" selection-end-line="15" selection-end-column="74" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/InCome.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="2125">
+          <caret line="85" lean-forward="true" selection-start-line="85" selection-end-line="85" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/TradeActiveScan.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="225">
+          <caret line="9" column="14" lean-forward="true" selection-start-line="9" selection-start-column="14" selection-end-line="9" selection-end-column="14" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/AopClient.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1877">
+          <caret line="695" column="5" selection-start-line="695" selection-start-column="5" selection-end-line="695" selection-end-column="5" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/wappay/SignData.php">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="175">
+          <caret line="7" lean-forward="true" selection-start-line="7" selection-end-line="7" />
+        </state>
+      </provider>
+    </entry>
+  </component>
+</project>

+ 779 - 0
app/phpPay/AopClient.php

@@ -0,0 +1,779 @@
+<?php
+namespace app\phpPay;
+require_once 'AopEncrypt.php';
+
+class AopClient
+{
+    //返回数据格式
+    public $format = "json";
+    //api版本
+    public $apiVersion = "1.0";
+
+    // 表单提交字符集编码
+    public $postCharset = "UTF-8";
+
+    public $debugInfo = false;
+
+    private $fileCharset = "UTF-8";
+
+    private $RESPONSE_SUFFIX = "_response";
+
+    private $ERROR_RESPONSE = "error_response";
+
+    private $SIGN_NODE_NAME = "sign";
+    //加密XML节点名称
+    private $ENCRYPT_XML_NODE_NAME = "response_encrypted";
+
+    private $needEncrypt = false;
+    //签名类型
+    public $signType = "RSA";
+
+    //加密密钥和类型
+
+    public $encryptKey;
+
+    public $encryptType = "AES";
+
+
+    public function generateSign($params, $privateKey, $signType = "RSA")
+    {
+        return $this->sign($this->getSignContent($params), $privateKey, $signType);
+    }
+
+    public function rsaSign($params, $privateKey, $signType = "RSA")
+    {
+        return $this->sign($this->getSignContent($params), $privateKey, $signType);
+    }
+
+    function unicodeDecode($name)
+    {
+        $json = '{"str":"' . $name . '"}';
+        $arr = json_decode($json, true);
+        if (empty($arr)) return '';
+        return $arr['str'];
+    }
+
+    public function getSignContent($params)
+    {
+        ksort($params);
+        $stringToBeSigned = "";
+        foreach ($params as $k => $v) {
+            $isarray = is_array($v);
+            if ($isarray) {
+                $stringToBeSigned .= "$k" . "=" . json_encode($v, 320) . "&";
+            } else {
+                $stringToBeSigned .= "$k" . "=" . "$v" . "&";
+            }
+        }
+        unset ($k, $v);
+        $stringToBeSigned = substr($stringToBeSigned, 0, strlen($stringToBeSigned) - 1);
+        return $stringToBeSigned;
+    }
+
+
+    protected function sign($data, $rsaPrivateKey, $signType = "RSA")
+    {
+         $res = "-----BEGIN RSA PRIVATE KEY-----\n" .
+            wordwrap($rsaPrivateKey, 64, "\n", true) .
+            "\n-----END RSA PRIVATE KEY-----";
+
+        ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');
+
+        if ("RSA2" == $signType) {
+            openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA256);
+        } else {
+            openssl_sign($data, $sign, $res);
+        }
+
+        $sign = base64_encode($sign);
+        return $sign;
+    }
+
+//废弃
+    protected function signold($data, $signType = "RSA")
+    {
+
+        if ($this->checkEmpty($this->rsaPrivateKeyFilePath)) {
+            $priKey = $this->rsaPrivateKey;
+            $res = "-----BEGIN RSA PRIVATE KEY-----\n" .
+                wordwrap($priKey, 64, "\n", true) .
+                "\n-----END RSA PRIVATE KEY-----";
+        } else {
+            $priKey = file_get_contents($this->rsaPrivateKeyFilePath);
+            $res = openssl_get_privatekey($priKey);
+        }
+
+        ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');
+
+        if ("RSA2" == $signType) {
+            openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA256);
+        } else {
+            openssl_sign($data, $sign, $res);
+        }
+
+        if (!$this->checkEmpty($this->rsaPrivateKeyFilePath)) {
+            openssl_free_key($res);
+        }
+        $sign = base64_encode($sign);
+        return $sign;
+    }
+
+
+    public function curl($url, $postBodyString = null)
+    {
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_FAILONERROR, false);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+
+        $encodeArray = Array();
+        $postMultipart = false;
+
+        //echo  $postBodyString;
+
+        unset ($k, $v);
+        curl_setopt($ch, CURLOPT_POST, true);
+
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $postBodyString);
+        $this->writeLog("postBodyString" . $postBodyString);
+        $headers = array('content-type:application/json;charset=' . $this->postCharset);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+
+        $reponse = curl_exec($ch);
+
+        //echo  "reponse".$reponse;
+        if (curl_errno($ch)) {
+
+            throw new Exception(curl_error($ch), 0);
+        } else {
+            $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+            if (200 !== $httpStatusCode) {
+                throw new Exception($reponse, $httpStatusCode);
+            }
+        }
+
+        curl_close($ch);
+        return $reponse;
+    }
+
+    protected function getMillisecond()
+    {
+        list($s1, $s2) = explode(' ', microtime());
+        return (float)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000);
+    }
+
+    //请确保项目文件有可写权限,不然打印不了日志。
+    function writeLog($text)
+    {
+        // $text=iconv("GBK", "UTF-8//IGNORE", $text);
+        //$text = characet ( $text );
+        file_put_contents(dirname(__FILE__) . DIRECTORY_SEPARATOR . "../log.txt", date("Y-m-d H:i:s") . "  " . $text . "\r\n", FILE_APPEND);
+    }
+
+    /**
+     * 转换字符集编码
+     * @param $data
+     * @param $targetCharset
+     * @return string
+     */
+    function characet($data, $targetCharset)
+    {
+
+        if (!empty($data)) {
+            $fileType = $this->fileCharset;
+            if (strcasecmp($fileType, $targetCharset) != 0) {
+                $data = mb_convert_encoding($data, $targetCharset, $fileType);
+                //				$data = iconv($fileType, $targetCharset.'//IGNORE', $data);
+            }
+        }
+
+
+        return $data;
+    }
+
+    /**
+     * 校验$value是否非空
+     *  if not set ,return true;
+     *    if is null , return true;
+     **/
+    protected function checkEmpty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    /** rsaCheckV1 & rsaCheckV2
+     *  验证签名
+     *  在使用本方法前,必须初始化AopClient且传入公钥参数。
+     *  公钥是否是读取字符串还是读取文件,是根据初始化传入的值判断的。
+     **/
+    public function rsaCheckV1($params, $rsaPublicKeyFilePath, $signType = 'RSA')
+    {
+        $sign = $params['sign'];
+        $params['sign_type'] = null;
+        $params['sign'] = null;
+        return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath, $signType);
+    }
+
+    public function rsaCheckV2($params, $rsaPublicKeyFilePath, $signType = 'RSA')
+    {
+        $sign = $params['sign'];
+        $params['sign'] = null;
+        return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath, $signType);
+    }
+
+    function verify($paramStr, $sign,$rsaPublicKey)
+    {
+       // $pubKey = $this->$rsaPublicKey;
+        //将字符串格式公私钥转为pem格式公私钥
+        $pubKeyPem = $this->format_secret_key($rsaPublicKey, 'pub');
+        //转换为openssl密钥,必须是没有经过pkcs8转换的公钥
+        $res = openssl_get_publickey($pubKeyPem);
+        //url解码签名
+        //$signUrl = urldecode($sign);
+        //base64解码签名
+        $signBase64 = base64_decode($sign);
+        //调用openssl内置方法验签,返回bool值
+        $result = (bool)openssl_verify($paramStr, $signBase64, $res);
+        //释放资源
+        openssl_free_key($res);
+        //返回资源是否成功
+        return $result;
+    }
+
+    function format_secret_key($secret_key, $type)
+    {
+        // 64个英文字符后接换行符"\n",最后再接换行符"\n"
+        $key = (wordwrap($secret_key, 64, "\n", true)) . "\n";
+        // 添加pem格式头和尾
+        if ($type == 'pub') {
+            $pem_key = "-----BEGIN PUBLIC KEY-----\n" . $key . "-----END PUBLIC KEY-----\n";
+        } else if ($type == 'pri') {
+            $pem_key = "-----BEGIN RSA PRIVATE KEY-----\n" . $key . "-----END RSA PRIVATE KEY-----\n";
+        } else {
+            echo('公私钥类型非法');
+            exit();
+        }
+        return $pem_key;
+    }
+
+    public function checkSignAndDecrypt($params, $rsaPublicKeyPem, $rsaPrivateKeyPem, $isCheckSign, $isDecrypt)
+    {
+        $charset = $params['charset'];
+        $bizContent = $params['biz_content'];
+        if ($isCheckSign) {
+            if (!$this->rsaCheckV2($params, $rsaPublicKeyPem)) {
+                echo "<br/>checkSign failure<br/>";
+                exit;
+            }
+        }
+        if ($isDecrypt) {
+            return $this->rsaDecrypt($bizContent, $rsaPrivateKeyPem, $charset);
+        }
+
+        return $bizContent;
+    }
+
+    public function encryptAndSign($bizContent, $rsaPublicKeyPem, $rsaPrivateKeyPem, $charset, $isEncrypt, $isSign)
+    {
+        // 加密,并签名
+        if ($isEncrypt && $isSign) {
+            $encrypted = $this->rsaEncrypt($bizContent, $rsaPublicKeyPem, $charset);
+            $sign = $this->sign($bizContent);
+            $response = "<?xml version=\"1.0\" encoding=\"$charset\"?><alipay><response>$encrypted</response><encryption_type>RSA</encryption_type><sign>$sign</sign><sign_type>RSA</sign_type></alipay>";
+            return $response;
+        }
+        // 加密,不签名
+        if ($isEncrypt && (!$isSign)) {
+            $encrypted = $this->rsaEncrypt($bizContent, $rsaPublicKeyPem, $charset);
+            $response = "<?xml version=\"1.0\" encoding=\"$charset\"?><alipay><response>$encrypted</response><encryption_type>RSA</encryption_type></alipay>";
+            return $response;
+        }
+        // 不加密,但签名
+        if ((!$isEncrypt) && $isSign) {
+            $sign = $this->sign($bizContent);
+            $response = "<?xml version=\"1.0\" encoding=\"$charset\"?><alipay><response>$bizContent</response><sign>$sign</sign><sign_type>RSA</sign_type></alipay>";
+            return $response;
+        }
+        // 不加密,不签名
+        $response = "<?xml version=\"1.0\" encoding=\"$charset\"?>$bizContent";
+        return $response;
+    }
+
+    public function rsaEncrypt($data, $rsaPublicKeyPem, $charset)
+    {
+        //读取公钥文件
+        $pubKey = file_get_contents($rsaPublicKeyPem);
+        //转换为openssl格式密钥
+        $res = openssl_get_publickey($pubKey);
+        $blocks = $this->splitCN($data, 0, 30, $charset);
+        $chrtext  = null;
+        $encodes  = array();
+        foreach ($blocks as $n => $block) {
+            if (!openssl_public_encrypt($block, $chrtext , $res)) {
+                echo "<br/>" . openssl_error_string() . "<br/>";
+            }
+            $encodes[] = $chrtext ;
+        }
+        $chrtext = implode(",", $encodes);
+
+        return $chrtext;
+    }
+
+    public function rsaDecrypt($data, $rsaPrivateKeyPem, $charset)
+    {
+        //读取私钥文件
+        $priKey = file_get_contents($rsaPrivateKeyPem);
+        //转换为openssl格式密钥
+        $res = openssl_get_privatekey($priKey);
+        $decodes = explode(',', $data);
+        $strnull = "";
+        $dcyCont = "";
+        foreach ($decodes as $n => $decode) {
+            if (!openssl_private_decrypt($decode, $dcyCont, $res)) {
+                echo "<br/>" . openssl_error_string() . "<br/>";
+            }
+            $strnull .= $dcyCont;
+        }
+        return $strnull;
+    }
+
+    function splitCN($cont, $n = 0, $subnum, $charset)
+    {
+        //$len = strlen($cont) / 3;
+        $arrr = array();
+        for ($i = $n; $i < strlen($cont); $i += $subnum) {
+            $res = $this->subCNchar($cont, $i, $subnum, $charset);
+            if (!empty ($res)) {
+                $arrr[] = $res;
+            }
+        }
+
+        return $arrr;
+    }
+
+    function subCNchar($str, $start = 0, $length, $charset = "gbk")
+    {
+        if (strlen($str) <= $length) {
+            return $str;
+        }
+        $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
+        $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
+        $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
+        $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
+        preg_match_all($re[$charset], $str, $match);
+        $slice = join("", array_slice($match[0], $start, $length));
+        return $slice;
+    }
+
+    function parserResponseSubCode($request, $responseContent, $respObject, $format)
+    {
+
+        if ("json" == $format) {
+
+            $apiName = $request->getApiMethodName();
+            $rootNodeName = str_replace(".", "_", $apiName) . $this->RESPONSE_SUFFIX;
+            $errorNodeName = $this->ERROR_RESPONSE;
+
+            $rootIndex = strpos($responseContent, $rootNodeName);
+            $errorIndex = strpos($responseContent, $errorNodeName);
+
+            if ($rootIndex > 0) {
+                // 内部节点对象
+                $rInnerObject = $respObject->$rootNodeName;
+            } elseif ($errorIndex > 0) {
+
+                $rInnerObject = $respObject->$errorNodeName;
+            } else {
+                return null;
+            }
+
+            // 存在属性则返回对应值
+            if (isset($rInnerObject->sub_code)) {
+
+                return $rInnerObject->sub_code;
+            } else {
+
+                return null;
+            }
+
+
+        } elseif ("xml" == $format) {
+
+            // xml格式sub_code在同一层级
+            return $respObject->sub_code;
+
+        }
+
+
+    }
+
+    function parserJSONSignData($request, $responseContent, $responseJSON)
+    {
+
+        $signData = new SignData();
+
+        $signData->sign = $this->parserJSONSign($responseJSON);
+        $signData->signSourceData = $this->parserJSONSignSource($request, $responseContent);
+
+
+        return $signData;
+
+    }
+
+    function parserJSONSignSource($request, $responseContent)
+    {
+
+        $apiName = $request->getApiMethodName();
+        $rootNodeName = str_replace(".", "_", $apiName) . $this->RESPONSE_SUFFIX;
+
+        $rootIndex = strpos($responseContent, $rootNodeName);
+        $errorIndex = strpos($responseContent, $this->ERROR_RESPONSE);
+
+
+        if ($rootIndex > 0) {
+
+            return $this->parserJSONSource($responseContent, $rootNodeName, $rootIndex);
+        } else if ($errorIndex > 0) {
+
+            return $this->parserJSONSource($responseContent, $this->ERROR_RESPONSE, $errorIndex);
+        } else {
+
+            return null;
+        }
+
+
+    }
+
+    function parserJSONSource($responseContent, $nodeName, $nodeIndex)
+    {
+        $signDataStartIndex = $nodeIndex + strlen($nodeName) + 2;
+        $signIndex = strpos($responseContent, "\"" . $this->SIGN_NODE_NAME . "\"");
+        // 签名前-逗号
+        $signDataEndIndex = $signIndex - 1;
+        $indexLen = $signDataEndIndex - $signDataStartIndex;
+        if ($indexLen < 0) {
+
+            return null;
+        }
+
+        return substr($responseContent, $signDataStartIndex, $indexLen);
+
+    }
+
+    function parserJSONSign($responseJSon)
+    {
+
+        return $responseJSon->sign;
+    }
+
+    function parserXMLSignData($request, $responseContent)
+    {
+
+
+        $signData = new SignData();
+
+        $signData->sign = $this->parserXMLSign($responseContent);
+        $signData->signSourceData = $this->parserXMLSignSource($request, $responseContent);
+
+
+        return $signData;
+
+
+    }
+
+    function parserXMLSignSource($request, $responseContent)
+    {
+
+
+        $apiName = $request->getApiMethodName();
+        $rootNodeName = str_replace(".", "_", $apiName) . $this->RESPONSE_SUFFIX;
+
+
+        $rootIndex = strpos($responseContent, $rootNodeName);
+        $errorIndex = strpos($responseContent, $this->ERROR_RESPONSE);
+        //		$this->echoDebug("<br/>rootNodeName:" . $rootNodeName);
+        //		$this->echoDebug("<br/> responseContent:<xmp>" . $responseContent . "</xmp>");
+
+
+        if ($rootIndex > 0) {
+
+            return $this->parserXMLSource($responseContent, $rootNodeName, $rootIndex);
+        } else if ($errorIndex > 0) {
+
+            return $this->parserXMLSource($responseContent, $this->ERROR_RESPONSE, $errorIndex);
+        } else {
+
+            return null;
+        }
+
+
+    }
+
+    function parserXMLSource($responseContent, $nodeName, $nodeIndex)
+    {
+        $signDataStartIndex = $nodeIndex + strlen($nodeName) + 1;
+        $signIndex = strpos($responseContent, "<" . $this->SIGN_NODE_NAME . ">");
+        // 签名前-逗号
+        $signDataEndIndex = $signIndex - 1;
+        $indexLen = $signDataEndIndex - $signDataStartIndex + 1;
+
+        if ($indexLen < 0) {
+            return null;
+        }
+
+
+        return substr($responseContent, $signDataStartIndex, $indexLen);
+
+
+    }
+
+    function parserXMLSign($responseContent)
+    {
+        $signNodeName = "<" . $this->SIGN_NODE_NAME . ">";
+        $signEndNodeName = "</" . $this->SIGN_NODE_NAME . ">";
+
+        $indexOfSignNode = strpos($responseContent, $signNodeName);
+        $indexOfSignEndNode = strpos($responseContent, $signEndNodeName);
+
+
+        if ($indexOfSignNode < 0 || $indexOfSignEndNode < 0) {
+            return null;
+        }
+
+        $nodeIndex = ($indexOfSignNode + strlen($signNodeName));
+
+        $indexLen = $indexOfSignEndNode - $nodeIndex;
+
+        if ($indexLen < 0) {
+            return null;
+        }
+
+        // 签名
+        return substr($responseContent, $nodeIndex, $indexLen);
+
+    }
+
+    /**
+     * 验签
+     * @param $request
+     * @param $signData
+     * @param $resp
+     * @param $respObject
+     * @throws Exception
+     */
+    public function checkResponseSign($request, $signData, $resp, $respObject)
+    {
+
+        if (!$this->checkEmpty($this->alipayPublicKey) || !$this->checkEmpty($this->alipayrsaPublicKey)) {
+
+
+            if ($signData == null || $this->checkEmpty($signData->sign) || $this->checkEmpty($signData->signSourceData)) {
+
+                throw new Exception(" check sign Fail! The reason : signData is Empty");
+            }
+
+
+            // 获取结果sub_code
+            $responseSubCode = $this->parserResponseSubCode($request, $resp, $respObject, $this->format);
+
+
+            if (!$this->checkEmpty($responseSubCode) || ($this->checkEmpty($responseSubCode) && !$this->checkEmpty($signData->sign))) {
+
+                $checkResult = $this->verify($signData->signSourceData, $signData->sign, $this->alipayPublicKey, $this->signType);
+
+
+                if (!$checkResult) {
+
+                    if (strpos($signData->signSourceData, "\\/") > 0) {
+
+                        $signData->signSourceData = str_replace("\\/", "/", $signData->signSourceData);
+
+                        $checkResult = $this->verify($signData->signSourceData, $signData->sign, $this->alipayPublicKey, $this->signType);
+
+                        if (!$checkResult) {
+                            throw new Exception("check sign Fail! [sign=" . $signData->sign . ", signSourceData=" . $signData->signSourceData . "]");
+                        }
+
+                    } else {
+
+                        throw new Exception("check sign Fail! [sign=" . $signData->sign . ", signSourceData=" . $signData->signSourceData . "]");
+                    }
+
+                }
+            }
+
+
+        }
+    }
+
+    private function setupCharsets($request)
+    {
+        if ($this->checkEmpty($this->postCharset)) {
+            $this->postCharset = 'UTF-8';
+        }
+        $str = preg_match('/[\x80-\xff]/', $this->appId) ? $this->appId : print_r($request, true);
+        $this->fileCharset = mb_detect_encoding($str, "UTF-8, GBK") == 'UTF-8' ? 'UTF-8' : 'GBK';
+    }
+
+    // 获取加密内容
+
+    private function encryptJSONSignSource($request, $responseContent)
+    {
+
+        $parsetItem = $this->parserEncryptJSONSignSource($request, $responseContent);
+
+        $bodyIndexContent = substr($responseContent, 0, $parsetItem->startIndex);
+        $bodyEndContent = substr($responseContent, $parsetItem->endIndex, strlen($responseContent) + 1 - $parsetItem->endIndex);
+
+        $bizContent = decrypt($parsetItem->encryptContent, $this->encryptKey);
+        return $bodyIndexContent . $bizContent . $bodyEndContent;
+
+    }
+
+
+    private function parserEncryptJSONSignSource($request, $responseContent)
+    {
+
+        $apiName = $request->getApiMethodName();
+        $rootNodeName = str_replace(".", "_", $apiName) . $this->RESPONSE_SUFFIX;
+
+        $rootIndex = strpos($responseContent, $rootNodeName);
+        $errorIndex = strpos($responseContent, $this->ERROR_RESPONSE);
+
+
+        if ($rootIndex > 0) {
+
+            return $this->parserEncryptJSONItem($responseContent, $rootNodeName, $rootIndex);
+        } else if ($errorIndex > 0) {
+
+            return $this->parserEncryptJSONItem($responseContent, $this->ERROR_RESPONSE, $errorIndex);
+        } else {
+
+            return null;
+        }
+
+
+    }
+
+
+    private function parserEncryptJSONItem($responseContent, $nodeName, $nodeIndex)
+    {
+        $signDataStartIndex = $nodeIndex + strlen($nodeName) + 2;
+        $signIndex = strpos($responseContent, "\"" . $this->SIGN_NODE_NAME . "\"");
+        // 签名前-逗号
+        $signDataEndIndex = $signIndex - 1;
+
+        if ($signDataEndIndex < 0) {
+
+            $signDataEndIndex = strlen($responseContent) - 1;
+        }
+
+        $indexLen = $signDataEndIndex - $signDataStartIndex;
+
+        $encContent = substr($responseContent, $signDataStartIndex + 1, $indexLen - 2);
+
+
+        $encryptParseItem = new EncryptParseItem();
+
+        $encryptParseItem->encryptContent = $encContent;
+        $encryptParseItem->startIndex = $signDataStartIndex;
+        $encryptParseItem->endIndex = $signDataEndIndex;
+
+        return $encryptParseItem;
+
+    }
+
+    // 获取加密内容
+
+    private function encryptXMLSignSource($request, $responseContent)
+    {
+
+        $parsetItem = $this->parserEncryptXMLSignSource($request, $responseContent);
+
+        $bodyIndexContent = substr($responseContent, 0, $parsetItem->startIndex);
+        $bodyEndContent = substr($responseContent, $parsetItem->endIndex, strlen($responseContent) + 1 - $parsetItem->endIndex);
+        $bizContent = decrypt($parsetItem->encryptContent, $this->encryptKey);
+
+        return $bodyIndexContent . $bizContent . $bodyEndContent;
+
+    }
+
+    private function parserEncryptXMLSignSource($request, $responseContent)
+    {
+
+
+        $apiName = $request->getApiMethodName();
+        $rootNodeName = str_replace(".", "_", $apiName) . $this->RESPONSE_SUFFIX;
+
+
+        $rootIndex = strpos($responseContent, $rootNodeName);
+        $errorIndex = strpos($responseContent, $this->ERROR_RESPONSE);
+        //		$this->echoDebug("<br/>rootNodeName:" . $rootNodeName);
+        //		$this->echoDebug("<br/> responseContent:<xmp>" . $responseContent . "</xmp>");
+
+
+        if ($rootIndex > 0) {
+
+            return $this->parserEncryptXMLItem($responseContent, $rootNodeName, $rootIndex);
+        } else if ($errorIndex > 0) {
+
+            return $this->parserEncryptXMLItem($responseContent, $this->ERROR_RESPONSE, $errorIndex);
+        } else {
+
+            return null;
+        }
+
+
+    }
+
+    private function parserEncryptXMLItem($responseContent, $nodeName, $nodeIndex)
+    {
+
+        $signDataStartIndex = $nodeIndex + strlen($nodeName) + 1;
+
+        $xmlStartNode = "<" . $this->ENCRYPT_XML_NODE_NAME . ">";
+        $xmlEndNode = "</" . $this->ENCRYPT_XML_NODE_NAME . ">";
+
+        $indexOfXmlNode = strpos($responseContent, $xmlEndNode);
+        if ($indexOfXmlNode < 0) {
+
+            $item = new EncryptParseItem();
+            $item->encryptContent = null;
+            $item->startIndex = 0;
+            $item->endIndex = 0;
+            return $item;
+        }
+
+        $startIndex = $signDataStartIndex + strlen($xmlStartNode);
+        $bizContentLen = $indexOfXmlNode - $startIndex;
+        $bizContent = substr($responseContent, $startIndex, $bizContentLen);
+
+        $encryptParseItem = new EncryptParseItem();
+        $encryptParseItem->encryptContent = $bizContent;
+        $encryptParseItem->startIndex = $signDataStartIndex;
+        $encryptParseItem->endIndex = $indexOfXmlNode + strlen($xmlEndNode);
+
+        return $encryptParseItem;
+
+    }
+
+
+    function echoDebug($content)
+    {
+
+        if ($this->debugInfo) {
+            echo "<br/>" . $content;
+        }
+
+    }
+
+
+}

+ 71 - 0
app/phpPay/AopEncrypt.php

@@ -0,0 +1,71 @@
+ <?php
+/**
+ *   加密工具类
+ *
+ * User: jiehua
+ * Date: 16/3/30
+ * Time: 下午3:25
+ */
+
+/**
+ * 加密方法
+ * @param string $str
+ * @return string
+ */
+ function encrypt($str,$screct_key){
+	//AES, 128 模式加密数据 CBC
+	$screct_key = base64_decode($screct_key);
+	$str = trim($str);
+	$str = addPKCS7Padding($str);
+	$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC),1);
+	$encrypt_str =  mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_CBC);
+	return base64_encode($encrypt_str);
+}
+
+/**
+ * 解密方法
+ * @param string $str
+ * @return string
+ */
+ function decrypt($str,$screct_key){
+	//AES, 128 模式加密数据 CBC
+	$str = base64_decode($str);
+	$screct_key = base64_decode($screct_key);
+	$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC),1);
+	$encrypt_str =  mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_CBC);
+	$encrypt_str = trim($encrypt_str);
+
+	$encrypt_str = stripPKSC7Padding($encrypt_str);
+	return $encrypt_str;
+
+}
+
+/**
+ * 填充算法
+ * @param string $source
+ * @return string
+ */
+function addPKCS7Padding($source){
+	$source = trim($source);
+	$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
+
+	$pad = $block - (strlen($source) % $block);
+	if ($pad <= $block) {
+		$char = chr($pad);
+		$source .= str_repeat($char, $pad);
+	}
+	return $source;
+}
+/**
+ * 移去填充算法
+ * @param string $source
+ * @return string
+ */
+function stripPKSC7Padding($source){
+	$source = trim($source);
+	$char = substr($source, -1);
+	$num = ord($char);
+	if($num==62)return $source;
+	$source = substr($source,0,-$num);
+	return $source;
+}

+ 19 - 0
app/phpPay/EncryptParseItem.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ *  TODO 补充说明 
+ *
+ * User: jiehua
+ * Date: 16/3/30
+ * Time: 下午8:55
+ */
+
+class EncryptParseItem {
+
+
+	public $startIndex;
+
+	public $endIndex;
+
+	public $encryptContent;
+
+} 

+ 18 - 0
app/phpPay/EncryptResponseData.php

@@ -0,0 +1,18 @@
+<?php
+/**
+ *  TODO 补充说明 
+ *
+ * User: jiehua
+ * Date: 16/3/30
+ * Time: 下午8:51
+ */
+
+class EncryptResponseData {
+
+
+	public $realContent;
+
+	public $returnContent;
+
+
+} 

+ 218 - 0
app/phpPay/InCome.php

@@ -0,0 +1,218 @@
+<?php
+
+header("Content-type: text/html; charset=utf-8");
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'AopClient.php';
+
+$privateKey = "MIICWwIBAAKBgQCOmsrFtFPTnEzfpJ/hDl5RODBxw4i9Ex3NmmG/N7A1+by032zZ
+ZgLLpdNh8y5otjFY0E37Nyr4FGKFRSSuDiTk8vfx3pv6ImS1Rxjjg4qdVHIfqhCe
+B0Z2ZPuBD3Gbj8hHFEtXZq8+msAFu/5ZQjiVhgs5WWBjh54LYWSum+d9+wIDAQAB
+AoGABKpLt+wOUf3rBeX81QADVeTgsNgUwRq+/truF7NasGlbIw+sH/CWZtMl9y5d
+dk9/jchCxNUpMrR4BKQebxNHYaltARH7fmdEVhEccrMwG1tsv5ZNt6zdEzHn5sWx
+lGEdgiRdceXBr9ApfrPEbSf9znKTZomaMrLUb1oTG8kgpQECQQDd3sHcyuYv0/5F
+1xJjZKbUDtACNHjXY/b9LNjViA4+6u8hPDiu1OHD7/hO6r86tyKyQE8ERSVM2eMb
+KgLy40zlAkEApIqPpoaGPqf1ZjXmLxjDc/UZzHr0KZYSobTI/bDyP3H4NBBIXaJL
+bKBtRn55+rvnUalZfwxmtC7hxAZjgzvRXwJACCAAOXW0uEurJCOcKMem1F02gN4r
+Drg6c0sRJcC1xNgVqcHq0Xw6SFKhZUJzflL2klCIlD9z/jx8dKI1OW/ZgQJAWfJt
+CMltRX8nhVJdnM1au173VXK5WqpxUPi1DwnVw50X484q4RTBSoaAdhLZt5lUoK2F
+ARDUbBdcz332lFz03QJAbMtVN2FC3NZW4CGaGuTfp5+tCGxLi5HFttgzPhhkvgXo
+wkeHBhf+DT8OslSxIpBhsb2l+o4Pv4wKBdBg5WJlRw==";
+		//随行付公钥
+$sxfPublic =
+    "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOmsrFtFPTnEzfpJ/hDl5RODBxw4i9Ex3NmmG/N7A1+by032zZZgLLpdNh8y5otjFY0E37Nyr4FGKFRSSuDiTk8vfx3pv6ImS1Rxjjg4qdVHIfqhCeB0Z2ZPuBD3Gbj8hHFEtXZq8+msAFu/5ZQjiVhgs5WWBjh54LYWSum+d9+wIDAQAB";
+
+
+    $array = array( //普通数组
+        "reqId" => "c3ba4932950a42618bc17a85bd2ec846",
+        "orgId" => "26680846",
+        "mecDisNm" => "签购单的的名称", //商户简称
+        "mblNo" => "185xxxxxx54",//商户联系电话
+        "operationalType" => "01",//经营类型(01线下 02线上 03非盈利类 04缴费类 05保险类 06私立院校类 )
+        "haveLicenseNo" => "03",//资质类型 ( 01自然人 02个体户 03企业)
+        "mecTypeFlag" => "00",//商户类型(00普通单店商户(非连锁商户) 01连锁总 02连锁分 03 1+n总 04 1+n分
+        "cprRegNmCn" => "澧县xxxxx责任公司",//营业执照注册名称
+        "registCode" => "914xxxxxxRLX3",//营业执照注册号
+        "licenseMatch" => "00",//是否三证合一(00是  01否)
+        "cprRegAddr" => "西商xxxxxx无校验",//地址
+        "regProvCd" => "130000000000",//省编码(国标)
+        "regCityCd" => "130700000000",//市编码(国标)
+        "regDistCd" => "130728000000",//区编码(国标)
+        "mccCd" => "5309",//微信类目(和mcc传其一,如果都传,以mcc为准)
+        "csTelNo" => "13xxxxxx222",//客服电话
+
+        "identityName" => "郭xx",//法人姓名
+        "identityTyp" => "00",//法人证件类型
+        "identityNo" => "4324xxxxxxxxx3X",//法人证件号
+        "actNm" => "澧县xxxxxxxxxx公司",//结算账户名
+        "actTyp" => "00",//结算账户类型(00对公 01对私)
+        "stmManIdNo" => "4324xxxxxxX",//账户人身份证号
+        "actNo" => "622848xxxxxxxxx000",//结算卡号
+        "lbnkNo" => "1031xxxxxx17",//开户支行联行行号xxxxxx
+
+        "licensePic" => "f94aa57552f0434d80026bccb9820f59",//营业执照
+        "legalPersonidPositivePic" => "7fbd5e6d0610422292af5f88c32e58b7",//法人身份证正面
+        "legalPersonidOppositePic" => "89535a39b5d9450294d59dae776ccc32",//法人身份证反面
+        "storePic" => "d704fe706ad040a99981b7ac37b7cb89",//门头照片
+        "insideScenePic" => "4236c4f475da4e79b50f9186ac048a27",//真实商户内景图片
+        "openingAccountLicensePic" => "697b9ea61f08404abf80de59fd17f594",//开户许可证
+
+    );
+
+        $qrcodeType = array("01", "02", "06", "07");
+        $qrcoderate = array("0.2", "0.2", "0.2", "0.2");
+        $qrcodeList = array();
+        for ($i = 0; $i < count($qrcodeType); $i++) {
+            $arr = array(
+
+                "rateType" => $qrcodeType[$i],
+                "rate" => $qrcoderate[$i],
+            );
+            array_push($qrcodeList, $arr);
+        }
+        $qrcodeList = array(
+            "qrcodeList" => $qrcodeList
+        );
+        $array = array_merge($array, $qrcodeList);
+        $response = getJsonParam($array);
+        $aopClient = new AopClient();
+        $signContent = $aopClient->generateSign($response,$privateKey);
+        $sign = array(
+            "sign" => $signContent
+        );
+        $reqStr = array_merge($response, $sign);
+        $reqStr = json_encode($reqStr,320);
+        $requestUrl = 'https://openapi-test.tianquetech.com/merchant/income';
+        $resp = $aopClient->curl($requestUrl, $reqStr);
+        echo "resp" . $resp;
+
+        $result = json_decode($resp,320);
+
+        $signResult = $result["sign"];
+        echo "signResult" . $signResult;
+        //  result.remove("sign");
+        unset($result["sign"]);
+        //  String resultStr = RSASignature.getOrderContent(result);
+
+        //sign
+        /// String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, privateKey));
+        $signContent = $aopClient->getSignContent($result);
+        echo "<br><br><br><br>";
+        echo "signContent:".$signContent;
+
+        echo "<br><br><br><br>";
+
+        $verify = $aopClient->verify($signContent, $signResult,$sxfPublic);
+        //组装加密串
+        if ($verify) {
+            echo("验签成功");
+        }
+
+
+
+        function getJsonParam($reqData)
+        {
+            $reqDataJson = array(
+                "mblNo" => $reqData["mblNo"],//商户联系电话
+                "mecDisNm" => $reqData["mecDisNm"],//商户简称
+                "operationalType" => $reqData["operationalType"],//经营类型(01线下 02线上 03非盈利类 04缴费类 05保险类 06私立院校类 )
+                //"attachMerces3hantNo"=>  $reqData["attachMerchantNo"],//挂靠平台商编
+                "mecTypeFlag" => $reqData["mecTypeFlag"],//商户类型(新: 00普通单店商户(非连锁商户)01连锁总 02连锁分 03 1+n总 04 1+n分,旧:01线上平台入驻 02普通 03连锁总店 04连锁分店  05 1+n总  06 1+n分)
+                "haveLicenseNo" => $reqData["haveLicenseNo"],//资质类型 ( 01自然人 02个体户 03企业)
+                //"parentMno"=>  $reqData["parentMno"],//所属总店商户编号
+                //"independentModel"=>  $reqData["independentModel"],//分店是否独立结算(00是 01否)
+                "qrcodeList" => $reqData["qrcodeList"],//二维码费率(01微信 02支付宝)
+                //"settleType"=>  $reqData["settleType"],//结算类型(新:03 T1 04 D1,旧:01-T1 02-D1)---默认值为D1
+                //"supportPayChannels"=>  $reqData["supportPayChannels"],//支持的支付渠道(01微信 02支付宝 03银联)不填默认全开
+                //"supportTradeTypes"=>  $reqData["supportTradeTypes"],//支持的交易类型(01主扫 02被扫 03公众号 04退货 05APP)不填默认全开
+                //"specifyWechatChannel"=>  $reqData["specifyWechatChannel"],//指定微信渠道号
+                //"onlineType"=>  $reqData["onlineType"],//线上普通商户类型 ( 01APP 02网站 03公众号)
+                //"onlineName"=>  $reqData["onlineName"],//线上普通商户名称 (APP名称/网站网址/公众号名称)
+                //"onlineTypeInfo"=>  $reqData["onlineTypeInfo"],//线上普通商户信息 (APP下载地址及账号信息)
+                "cprRegNmCn" => $reqData["cprRegNmCn"],//营业执照注册名称
+                "registCode" => $reqData["registCode"],//营业执照注册号
+                "licenseMatch" => $reqData["licenseMatch"],//是否三证合一(00是  01否)
+                //"orgCode"=>  $reqData["orgCode"],//组织机构代码
+                //"taxRegNo"=>  $reqData["taxRegNo"],//税务登记号
+                //"businessLicStt"=>  $reqData["businessLicStt"],//营业执照起始日
+                //"businessLicEnt"=>  $reqData["businessLicEnt"],//营业执照到期日
+                "cprRegAddr" => $reqData["cprRegAddr"],//地址
+                "regProvCd" => $reqData["regProvCd"],//省编码(国标)
+                "regCityCd" => $reqData["regCityCd"],//市编码(国标)
+                "regDistCd" => $reqData["regDistCd"],//区编码(国标)
+                "mccCd" => $reqData["mccCd"],//微信类目(和mcc传其一,如果都传,以mcc为准)
+                "csTelNo" => $reqData["csTelNo"],//客服电话
+                "identityName" => $reqData["identityName"],//法人姓名
+                "identityTyp" => $reqData["identityTyp"],//法人证件类型
+                "identityNo" => $reqData["identityNo"],//法人证件号
+                //"legalPersonLicStt"=>  $reqData["legalPersonLicStt"],//法人身份证开始日期
+                //"legalPersonLicEnt"=>  $reqData["legalPersonLicEnt"],//法人身份证结束日期
+                "actNm" => $reqData["actNm"],//结算账户名
+                "actTyp" => $reqData["actTyp"],//结算账户类型(00对公 01对私)
+                "stmManIdNo" => $reqData["stmManIdNo"],//账户人身份证号
+                //"accountLicStt"=>  $reqData["accountLicStt"],//账户人证件号起始日
+                //"accountLicEnt"=>  $reqData["accountLicEnt"],//账户人证件号到期日
+                "actNo" => $reqData["actNo"],//结算卡号
+                "lbnkNo" => $reqData["lbnkNo"],//开户支行联行行号
+                //"lbnkNm"=>  $reqData["lbnkNm"],//开户支行名称
+                "licensePic" => $reqData["licensePic"],//营业执照
+                //"taxRegistLicensePic"=>  $reqData["taxRegistLicensePic"],//税务登记证
+                //"orgCodePic"=>  $reqData["orgCodePic"],//组织机构代码证
+                "legalPersonidPositivePic" => $reqData["legalPersonidPositivePic"],//法人身份证正面
+                "legalPersonidOppositePic" => $reqData["legalPersonidOppositePic"],//法人身份证反面
+                "openingAccountLicensePic" => $reqData["openingAccountLicensePic"],//开户许可证
+                //"bankCardPositivePic"=>  $reqData["bankCardPositivePic"],//银行卡正面
+                //"bankCardOppositePic"=>  $reqData["bankCardOppositePic"],//银行卡反面
+                //"settlePersonIdcardOpposite"=>  $reqData["settlePersonIdcardOpposite"],//结算人身份证反面
+                //"settlePersonIdcardPositive"=>  $reqData["settlePersonIdcardPositive"],//结算人身份证正面
+                //"merchantAgreementPic"=>  $reqData["merchantAgreementPic"],//商户协议照片
+                "storePic" => $reqData["storePic"],//门头照片
+                "insideScenePic" => $reqData["insideScenePic"],//真实商户内景图片
+                //"businessPlacePic"=>  $reqData["businessPlacePic"],//经营场所-含收银台
+                //"merchantEnterProtocol"=>  $reqData["merchantEnterProtocol"],//商家入驻协议
+                //"icpLicence"=>  $reqData["icpLicence"],//ICP许可证
+                //"handIdcardPic"=>  $reqData["handIdcardPic"],//手持身份证照片
+                //"leaseAgreementThreePic"=>  $reqData["leaseAgreementThreePic"],//租赁协议三(签章页)
+                //"leaseAgreementTwoPic"=>  $reqData["leaseAgreementTwoPic"],//租赁协议二(面积、有效期页)
+                //"leaseAgreementOnePic"=>  $reqData["leaseAgreementOnePic"],//租赁协议一(封面)
+                //"otherMaterialPictureOne"=>  $reqData["otherMaterialPictureOne"],//其他资料照片1
+                //"otherMaterialPictureTwo"=>  $reqData["otherMaterialPictureTwo"],//其他资料照片2
+                //"otherMaterialPictureThree"=>  $reqData["otherMaterialPictureThree"],//其他资料照片3
+                //"otherMaterialPictureFour"=>  $reqData["otherMaterialPictureFour"],//其他资料照片4
+                //"otherMaterialPictureFive"=>  $reqData["otherMaterialPictureFive"],//其他资料照片5
+                //"agentPersonSignature"=>  $reqData["agentPersonSignature"],//代理人签名
+                //"confirmPersonSignature"=>  $reqData["confirmPersonSignature"],//确认人签名
+                //"letterOfAuthPic"=>  $reqData["letterOfAuthPic"],//非法人结算授权函
+                //"unionSettleWithoutLicense"=>  $reqData["unionSettleWithoutLicense"],//统一结算无营业执照说明
+                //"societyGroupLegPerPic"=>  $reqData["societyGroupLegPerPic"],//社会团体法人证书
+                //"foundationLegPerRegPic"=>  $reqData["foundationLegPerRegPic"],//基金会法人登记证书
+                //"schoolLicese"=>  $reqData["schoolLicese"],//办学许可证
+                //"medicalInstitutionLicense"=>  $reqData["medicalInstitutionLicense"],//医疗机构办学许可证
+                //"insuranceLicese"=>  $reqData["insuranceLicese"],//经营保险业务许可证
+                //"insuranceLegPerGradePic"=>  $reqData["insuranceLegPerGradePic"],//保险业务法人等级证书
+                //"privateEducationLicense"=>  $reqData["privateEducationLicense"],//民办教育许可证
+                //"chargeProofPic"=>  $reqData["chargeProofPic"],//收费证明文件
+
+                //"Add("societyGroupLegPerPic", $reqData["societyGroupLegPerPic"]),//其他资料照片1
+                //"Add("foundationLegPerRegPic", $reqData["foundationLegPerRegPic"]),//其他资料照片2
+                //"Add("schoolLicese", $reqData["schoolLicese"]),//其他资料照片3
+                //"Add("medicalInstitutionLicense", $reqData["medicalInstitutionLicense"]),//其他资料照片4
+                //"Add("insuranceLicese", $reqData["insuranceLicese"]),//其他资料照片5
+                //"Add("insuranceLegPerGradePic", $reqData["insuranceLegPerGradePic"]),//其他资料照片5
+                //"Add("privateEducationLicense", $reqData["privateEducationLicense"]),//其他资料照片5
+                //"Add("chargeProofPic", $reqData["chargeProofPic"]),//其他资料照片5
+            );
+
+
+            $reqJson = array(
+                "reqData" => $reqDataJson,
+                "orgId" => $reqData["orgId"],
+                "reqId" => $reqData["reqId"],
+                "version" => "1.0",//OEM和代理商的要传2.0,服务商传1.0
+                "signType" => "RSA",
+                "timestamp" => 1583570048783,
+            );
+
+
+            return $reqJson;
+        }
+
+?>

+ 16 - 0
app/phpPay/SignData.php

@@ -0,0 +1,16 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: jiehua
+ * Date: 15/5/2
+ * Time: 下午6:21
+ */
+
+class SignData {
+
+    public $signSourceData=null;
+
+
+    public $sign=null;
+
+} 

+ 90 - 0
app/phpPay/TradeActiveScan.php

@@ -0,0 +1,90 @@
+<?php
+//交易主扫(C扫B)
+header("Content-type: text/html; charset=utf-8");
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'AopClient.php';
+
+$privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAI6aysW0U9OcTN+kn+EOXlE4MHHDiL0THc2aYb83sDX5vLTfbNlmAsul02HzLmi2MVjQTfs3KvgUYoVFJK4OJOTy9/Hem/oiZLVHGOODip1Uch+qEJ4HRnZk+4EPcZuPyEcUS1dmrz6awAW7/llCOJWGCzlZYGOHngthZK6b5337AgMBAAECgYAEqku37A5R/esF5fzVAANV5OCw2BTBGr7+2u4Xs1qwaVsjD6wf8JZm0yX3Ll12T3+NyELE1SkytHgEpB5vE0dhqW0BEft+Z0RWERxyszAbW2y/lk23rN0TMefmxbGUYR2CJF1x5cGv0Cl+s8RtJ/3OcpNmiZoystRvWhMbySClAQJBAN3ewdzK5i/T/kXXEmNkptQO0AI0eNdj9v0s2NWIDj7q7yE8OK7U4cPv+E7qvzq3IrJATwRFJUzZ4xsqAvLjTOUCQQCkio+mhoY+p/VmNeYvGMNz9RnMevQplhKhtMj9sPI/cfg0EEhdoktsoG1Gfnn6u+dRqVl/DGa0LuHEBmODO9FfAkAIIAA5dbS4S6skI5wox6bUXTaA3isOuDpzSxElwLXE2BWpwerRfDpIUqFlQnN+UvaSUIiUP3P+PHx0ojU5b9mBAkBZ8m0IyW1FfyeFUl2czVq7XvdVcrlaqnFQ+LUPCdXDnRfjzirhFMFKhoB2Etm3mVSgrYUBENRsF1zPffaUXPTdAkBsy1U3YULc1lbgIZoa5N+nn60IbEuLkcW22DM+GGS+BejCR4cGF/4NPw6yVLEikGGxvaX6jg+/jAoF0GDlYmVH";
+$sxfPublic =
+    "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOmsrFtFPTnEzfpJ/hDl5RODBxw4i9Ex3NmmG/N7A1+by032zZZgLLpdNh8y5otjFY0E37Nyr4FGKFRSSuDiTk8vfx3pv6ImS1Rxjjg4qdVHIfqhCeB0Z2ZPuBD3Gbj8hHFEtXZq8+msAFu/5ZQjiVhgs5WWBjh54LYWSum+d9+wIDAQAB";
+$aopClient = new AopClient();
+	$array = [
+            //业务参数
+            "mno"=> "399190910000387", //商户编号
+		    "ordNo"=> time(), //商户订单号
+		    //"subMechId"=> "", //子商户号
+		    //"subAppid"=> "", //微信 subAppId
+			"amt"=> "0.02", //订单总金额
+			//"discountAmt"=> "", //参与优惠金额
+			//"unDiscountAmt"=> "", //不参与优惠金额
+			"payType"=> "WECHAT", //支付渠道
+			"subject"=> "C扫B测试",
+            "tradeSource"=> "01", //交易来源 01服务商,02收银台,03硬件
+			"trmIp"=> "127.0.0.1",
+			//"hbFqNum"=> "6", //花呗分期数,仅可上送 6 或 12
+			//"hbFqPercent"=> "0", //卖家承担分期 服务费比例,仅支持上送 0 或 100
+			//"limitPay"=> "00", //限制卡类型: 00-全部 01-限定不能使 用信用卡支付 默认值 00
+			//"timeExpire"=> "10", //订单失效时间
+			//"goodsTag"=> "00", //订单优惠标识 00:是,01: 否
+			//"couponDetail"=> "", //优惠详情信息,见下面三个字段
+			//"costPrice"=> "200", //订单原价保留两 位小数;微信 独有
+			//"receiptId"=> "123456789", //商品小票
+			//"goodsDetail"=> "123456789", //单品优惠信息使用 json 数组格式提交
+			//"goodsId"=> "200", //商品编码
+			//"thirdGoodsId"=> "12345678", //微信/支付宝侧商品码
+			//"goodsName"=> "苹果电脑", //商品名称
+			//"quantity"=> "1", //商品数量
+			//"price"=> "1.01", //商品单价
+			//"goodsCategory"=> "", //商品类目;支 付宝独有
+			//"categoriesTree"=> "124868003|126232002|126252004", //商品类目树
+			//"goodsDesc"=> "", //商品描述;支 付宝独有
+			//"showUrl"=> "", //商品展示地址 url;支付宝独有
+			//"needReceipt"=> "00", //电子发票功能 微信开具电子 发票使用
+			//"ledgerAccountFlag"=> "00", //是否做分账 分账交易使 用;00:做; 01:不做;不传默认为不做分账
+			//"ledgerAccountEffectTime"=> "00", //分账有效时间 单位为天;是 否做分账选择 00 时该字段必传
+			//"notifyUrl"=> "", //回调地址
+			//"ylTrmNo"=> "", //银联终端号
+			//"terminalId"=> "", //TQ机具编号
+			//"deviceNo"=> "", //设备号
+			//"identityFlag"=> "", //是否是实名支付
+			//"buyerIdType"=> "IDCARD", //证件类型
+			//"buyerIdNo"=> "410523198701054018", //证件号
+			//"buyerName"=> "张三", //买家姓名
+			//"mobileNum"=> "", //手机号
+			//"extend"=> "" //备用
+	];
+
+	$reqBean = [
+		"orgId" =>"26680846",
+		"reqData"=>$array,
+		"reqId" => time(),
+		"signType" => "RSA",
+		"timestamp" => date("Y-m-d h:i:s"),
+		"version" => "1.0",
+	];
+
+
+	$signContent = $aopClient->generateSign($reqBean,$privateKey);
+	$sign =["sign" => $signContent];
+	$reqStr = array_merge($reqBean, $sign);
+	$reqStr = json_encode($reqStr,320);
+	$requestUrl = 'https://openapi-test.tianquetech.com/order/activeScan';
+	$resp = $aopClient->curl($requestUrl, $reqStr);
+	$result = json_decode($resp,320);
+	print_r($result);
+	$signResult = $result["sign"];
+	//  result.remove("sign");
+	unset($result["sign"]);
+	//  String resultStr = RSASignature.getOrderContent(result);
+
+	//sign
+	/// String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, privateKey));
+	$signContent = $aopClient->getSignContent($result);
+
+	$verify = $aopClient->verify($signContent, $signResult,$sxfPublic);
+	//组装加密串
+	if ($verify) {
+		echo("验签成功");
+	}else{
+		echo("验签失败");
+	}
+?>

+ 109 - 0
app/phpPay/TradeJsApiScan.php

@@ -0,0 +1,109 @@
+<?php
+//聚合支付
+header("Content-type: text/html; charset=utf-8");
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'AopClient.php';
+
+$privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMMNNYaXLfqFBKNW
+j7wocV4s1cC88tGwYBt3lVD8WGm12iuqHB20ybUsCof4r4IYWR74IcyWUNqTrzSJ
+K3cEmk2MtAmI7COZJTv9r4DnxbCARnKgyN18l+idXQf91YiGREnGPKZ1R1kQ+A+7
+6rtAsZILmg0lZAJ7xa4J8Za/0lafAgMBAAECgYBUeschGR+H7s74c8hjZVzcviyC
+gxPkcDDgFKYuYm1ks6ff25i74Q6wEngpNjPF9Ae9mxkAhGZWlTqAVZzmuq6dgG7D
+aKqXNXkdDgovHEwHcRO1Rhfb3Rv0oYhzhldi7m0QobuvslMZRoVH76Ehes2Pfu3Z
+Lcbq30D47CeRBUyA6QJBAOBIExJvtK6xIcOO1JBmi9dmk9SKuDrnltnGvT1E8WTg
+B/Di3d/moksNLYTijTjimnVcQ6XV6ZQkEZOkes/Q/HUCQQDeouOS0HQ35T04A9tM
+UDOKMObIAwAUyRi01N0/Shi5VQq2RyWPB8YQQT54NeeFkSGXnj4iJV+jWdsK8gkE
+ZrRDAkB3K/TuW+qu1DHznkY2QDbYCopMajVAH2RZbS+KicKWbi/qADIS0ZK0vFjO
+fi655jZaW98aFBLcA1pPkBstp4ctAkEA1Rt+Uq4OUOKxcsjeRXIPo5ujjJiynzLO
+32lSTp6Sg/SPSGNZ5EtAn5aUQWT3tLZzPTpPp0e3ABmmvhdn4jqdGQJBANW54TYs
+Eh6jurxh77vtVS0I2RNhUS8dkDCFqDtFI99r2hN0hxIAz11U7p42gyUVmXb4PAgI
+awQyTrfxvQ8Mty0=";
+$sxfPublic =
+    "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDDTWGly36hQSjVo+8KHFeLNXA
+vPLRsGAbd5VQ/FhptdorqhwdtMm1LAqH+K+CGFke+CHMllDak680iSt3BJpNjLQJ
+iOwjmSU7/a+A58WwgEZyoMjdfJfonV0H/dWIhkRJxjymdUdZEPgPu+q7QLGSC5oN
+JWQCe8WuCfGWv9JWnwIDAQAB";
+$aopClient = new AopClient();
+	$array = [
+            //业务参数
+            "mno"=> "399190910000387", //商户编号
+		    "ordNo"=> time(), //商户订单号
+		    //"subMechId"=> "", //子商户号
+		    //"subAppid"=> "", //微信 subAppId
+			"amt"=> "0.02", //订单总金额
+			//"discountAmt"=> "", //参与优惠金额
+			//"unDiscountAmt"=> "", //不参与优惠金额
+			"payType"=> "WECHAT", //支付渠道
+			"payWay"=> "02", //支付方式  02 公众号/服 务窗/js支付 03 小程序
+			"subject"=> "聚合支付测试",
+            "tradeSource"=> "01", //交易来源 01服务商,02收银台,03硬件
+			"trmIp"=> "127.0.0.1",
+			"customerIp"=> "", //持卡人ip地址,银联js支付时必传
+			"userId"=> "2088101117955611", //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
+			//"hbFqNum"=> "6", //花呗分期数,仅可上送 6 或 12
+			//"hbFqPercent"=> "0", //卖家承担分期 服务费比例,仅支持上送 0 或 100
+			//"limitPay"=> "00", //限制卡类型: 00-全部 01-限定不能使 用信用卡支付 默认值 00
+			//"timeExpire"=> "10", //订单失效时间
+			//"goodsTag"=> "00", //订单优惠标识 00:是,01: 否
+			//"couponDetail"=> "", //优惠详情信息,见下面三个字段
+			//"costPrice"=> "200", //订单原价保留两 位小数;微信 独有
+			//"receiptId"=> "123456789", //商品小票
+			//"goodsDetail"=> "123456789", //单品优惠信息使用 json 数组格式提交
+			//"goodsId"=> "200", //商品编码
+			//"thirdGoodsId"=> "12345678", //微信/支付宝侧商品码
+			//"goodsName"=> "苹果电脑", //商品名称
+			//"quantity"=> "1", //商品数量
+			//"price"=> "1.01", //商品单价
+			//"goodsCategory"=> "", //商品类目;支 付宝独有
+			//"categoriesTree"=> "124868003|126232002|126252004", //商品类目树
+			//"goodsDesc"=> "", //商品描述;支 付宝独有
+			//"showUrl"=> "", //商品展示地址 url;支付宝独有
+			//"needReceipt"=> "00", //电子发票功能 微信开具电子 发票使用
+			//"ledgerAccountFlag"=> "00", //是否做分账 分账交易使 用;00:做; 01:不做;不传默认为不做分账
+			//"ledgerAccountEffectTime"=> "00", //分账有效时间 单位为天;是 否做分账选择 00 时该字段必传
+			//"notifyUrl"=> "", //回调地址
+			//"ylTrmNo"=> "", //银联终端号
+			//"terminalId"=> "", //TQ机具编号
+			//"deviceNo"=> "", //设备号
+			//"identityFlag"=> "", //是否是实名支付
+			//"buyerIdType"=> "IDCARD", //证件类型
+			//"buyerIdNo"=> "410523198701054018", //证件号
+			//"buyerName"=> "张三", //买家姓名
+			//"mobileNum"=> "", //手机号
+			//"extend"=> "" //备用
+	];
+
+	$reqBean = [
+		"orgId" =>"90589021",
+		"reqData"=>$array,
+		"reqId" => time(),
+		"signType" => "RSA",
+		"timestamp" => date("Y-m-d h:i:s"),
+		"version" => "1.0",
+	];
+
+
+	$signContent = $aopClient->generateSign($reqBean,$privateKey);
+	$sign =["sign" => $signContent];
+	$reqStr = array_merge($reqBean, $sign);
+	$reqStr = json_encode($reqStr,320);
+	$requestUrl = 'https://openapi-test.tianquetech.com/order/jsapiScan';
+	$resp = $aopClient->curl($requestUrl, $reqStr);
+	$result = json_decode($resp,320);
+	print_r($result);
+	$signResult = $result["sign"];
+	//  result.remove("sign");
+	unset($result["sign"]);
+	//  String resultStr = RSASignature.getOrderContent(result);
+
+	//sign
+	/// String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, privateKey));
+	$signContent = $aopClient->getSignContent($result);
+
+	$verify = $aopClient->verify($signContent, $signResult,$sxfPublic);
+	//组装加密串
+	if ($verify) {
+		echo("验签成功");
+	}else{
+		echo("验签失败");
+	}
+?>

+ 55 - 0
app/phpPay/TradeQuery.php

@@ -0,0 +1,55 @@
+<?php
+//正交易(主扫,被扫,聚合支付)查询
+header("Content-type: text/html; charset=utf-8");
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'AopClient.php';
+
+$privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAI6aysW0U9OcTN+kn+EOXlE4MHHDiL0THc2aYb83sDX5vLTfbNlmAsul02HzLmi2MVjQTfs3KvgUYoVFJK4OJOTy9/Hem/oiZLVHGOODip1Uch+qEJ4HRnZk+4EPcZuPyEcUS1dmrz6awAW7/llCOJWGCzlZYGOHngthZK6b5337AgMBAAECgYAEqku37A5R/esF5fzVAANV5OCw2BTBGr7+2u4Xs1qwaVsjD6wf8JZm0yX3Ll12T3+NyELE1SkytHgEpB5vE0dhqW0BEft+Z0RWERxyszAbW2y/lk23rN0TMefmxbGUYR2CJF1x5cGv0Cl+s8RtJ/3OcpNmiZoystRvWhMbySClAQJBAN3ewdzK5i/T/kXXEmNkptQO0AI0eNdj9v0s2NWIDj7q7yE8OK7U4cPv+E7qvzq3IrJATwRFJUzZ4xsqAvLjTOUCQQCkio+mhoY+p/VmNeYvGMNz9RnMevQplhKhtMj9sPI/cfg0EEhdoktsoG1Gfnn6u+dRqVl/DGa0LuHEBmODO9FfAkAIIAA5dbS4S6skI5wox6bUXTaA3isOuDpzSxElwLXE2BWpwerRfDpIUqFlQnN+UvaSUIiUP3P+PHx0ojU5b9mBAkBZ8m0IyW1FfyeFUl2czVq7XvdVcrlaqnFQ+LUPCdXDnRfjzirhFMFKhoB2Etm3mVSgrYUBENRsF1zPffaUXPTdAkBsy1U3YULc1lbgIZoa5N+nn60IbEuLkcW22DM+GGS+BejCR4cGF/4NPw6yVLEikGGxvaX6jg+/jAoF0GDlYmVH";
+$sxfPublic =
+    "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOmsrFtFPTnEzfpJ/hDl5RODBxw4i9Ex3NmmG/N7A1+by032zZZgLLpdNh8y5otjFY0E37Nyr4FGKFRSSuDiTk8vfx3pv6ImS1Rxjjg4qdVHIfqhCeB0Z2ZPuBD3Gbj8hHFEtXZq8+msAFu/5ZQjiVhgs5WWBjh54LYWSum+d9+wIDAQAB";
+$aopClient = new AopClient();
+	$array = [
+            //业务参数
+            "mno"=> "399190910000387", //商户编号
+		    //下面三个至少传一个
+		    "ordNo"=> "", //商户订单号
+		    "uuid"=> "", //科技公司订单号
+		    "transactionId"=> "", //正交易落单号
+		    //"terminalId"=> "", //TQ 机具编号, 支付来源为硬 件时,该参数 为必传;
+		    //"deviceNo"=> ""//设备号
+	];
+
+	$reqBean = [
+		"orgId" =>"26680846",
+		"reqData"=>$array,
+		"reqId" => time(),
+		"signType" => "RSA",
+		"timestamp" => date("Y-m-d h:i:s"),
+		"version" => "1.0",
+	];
+
+
+	$signContent = $aopClient->generateSign($reqBean,$privateKey);
+	$sign =["sign" => $signContent];
+	$reqStr = array_merge($reqBean, $sign);
+	$reqStr = json_encode($reqStr,320);
+	$requestUrl = 'https://openapi-test.tianquetech.com/query/tradeQuery';
+	$resp = $aopClient->curl($requestUrl, $reqStr);
+	$result = json_decode($resp,320);
+	print_r($result);
+	$signResult = $result["sign"];
+	//  result.remove("sign");
+	unset($result["sign"]);
+	//  String resultStr = RSASignature.getOrderContent(result);
+
+	//sign
+	/// String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, privateKey));
+	$signContent = $aopClient->getSignContent($result);
+
+	$verify = $aopClient->verify($signContent, $signResult,$sxfPublic);
+	//组装加密串
+	if ($verify) {
+		echo("验签成功");
+	}else{
+		echo("验签失败");
+	}
+?>

+ 58 - 0
app/phpPay/TradeRefund.php

@@ -0,0 +1,58 @@
+<?php
+//交易退款
+header("Content-type: text/html; charset=utf-8");
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'AopClient.php';
+
+$privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAI6aysW0U9OcTN+kn+EOXlE4MHHDiL0THc2aYb83sDX5vLTfbNlmAsul02HzLmi2MVjQTfs3KvgUYoVFJK4OJOTy9/Hem/oiZLVHGOODip1Uch+qEJ4HRnZk+4EPcZuPyEcUS1dmrz6awAW7/llCOJWGCzlZYGOHngthZK6b5337AgMBAAECgYAEqku37A5R/esF5fzVAANV5OCw2BTBGr7+2u4Xs1qwaVsjD6wf8JZm0yX3Ll12T3+NyELE1SkytHgEpB5vE0dhqW0BEft+Z0RWERxyszAbW2y/lk23rN0TMefmxbGUYR2CJF1x5cGv0Cl+s8RtJ/3OcpNmiZoystRvWhMbySClAQJBAN3ewdzK5i/T/kXXEmNkptQO0AI0eNdj9v0s2NWIDj7q7yE8OK7U4cPv+E7qvzq3IrJATwRFJUzZ4xsqAvLjTOUCQQCkio+mhoY+p/VmNeYvGMNz9RnMevQplhKhtMj9sPI/cfg0EEhdoktsoG1Gfnn6u+dRqVl/DGa0LuHEBmODO9FfAkAIIAA5dbS4S6skI5wox6bUXTaA3isOuDpzSxElwLXE2BWpwerRfDpIUqFlQnN+UvaSUIiUP3P+PHx0ojU5b9mBAkBZ8m0IyW1FfyeFUl2czVq7XvdVcrlaqnFQ+LUPCdXDnRfjzirhFMFKhoB2Etm3mVSgrYUBENRsF1zPffaUXPTdAkBsy1U3YULc1lbgIZoa5N+nn60IbEuLkcW22DM+GGS+BejCR4cGF/4NPw6yVLEikGGxvaX6jg+/jAoF0GDlYmVH";
+$sxfPublic =
+    "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOmsrFtFPTnEzfpJ/hDl5RODBxw4i9Ex3NmmG/N7A1+by032zZZgLLpdNh8y5otjFY0E37Nyr4FGKFRSSuDiTk8vfx3pv6ImS1Rxjjg4qdVHIfqhCeB0Z2ZPuBD3Gbj8hHFEtXZq8+msAFu/5ZQjiVhgs5WWBjh54LYWSum+d9+wIDAQAB";
+$aopClient = new AopClient();
+	$array = [
+            //业务参数
+            "mno"=> "399190910000387", //商户编号
+		    "ordNo"=> time(), //商户订单号
+		    //下面三个至少传一个
+		    "origOrderNo"=> "", //原商户订单号
+		    "origUuid"=> "", //原交易科技公司订单号
+		    "origSxfUuid"=> "", //正交易落单号
+		    "amt"=> "88.88", //正交易落单号
+		   // "notifyUrl"=> "", //回调推送地址,用来接收科技公司的异步推送
+		    "refundReason"=> "退货", //退货原因
+		    "extend"=> "" //备用
+	];
+
+	$reqBean = [
+		"orgId" =>"26680846",
+		"reqData"=>$array,
+		"reqId" => time(),
+		"signType" => "RSA",
+		"timestamp" => date("Y-m-d h:i:s"),
+		"version" => "1.0",
+	];
+
+
+	$signContent = $aopClient->generateSign($reqBean,$privateKey);
+	$sign =["sign" => $signContent];
+	$reqStr = array_merge($reqBean, $sign);
+	$reqStr = json_encode($reqStr,320);
+	$requestUrl = 'https://openapi-test.tianquetech.com/order/refund';
+	$resp = $aopClient->curl($requestUrl, $reqStr);
+	$result = json_decode($resp,320);
+	print_r($result);
+	$signResult = $result["sign"];
+	//  result.remove("sign");
+	unset($result["sign"]);
+	//  String resultStr = RSASignature.getOrderContent(result);
+
+	//sign
+	/// String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, privateKey));
+	$signContent = $aopClient->getSignContent($result);
+
+	$verify = $aopClient->verify($signContent, $signResult,$sxfPublic);
+	//组装加密串
+	if ($verify) {
+		echo("验签成功");
+	}else{
+		echo("验签失败");
+	}
+?>

+ 52 - 0
app/phpPay/TradeRefundQuery.php

@@ -0,0 +1,52 @@
+<?php
+//退款查询
+header("Content-type: text/html; charset=utf-8");
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'AopClient.php';
+
+$privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAI6aysW0U9OcTN+kn+EOXlE4MHHDiL0THc2aYb83sDX5vLTfbNlmAsul02HzLmi2MVjQTfs3KvgUYoVFJK4OJOTy9/Hem/oiZLVHGOODip1Uch+qEJ4HRnZk+4EPcZuPyEcUS1dmrz6awAW7/llCOJWGCzlZYGOHngthZK6b5337AgMBAAECgYAEqku37A5R/esF5fzVAANV5OCw2BTBGr7+2u4Xs1qwaVsjD6wf8JZm0yX3Ll12T3+NyELE1SkytHgEpB5vE0dhqW0BEft+Z0RWERxyszAbW2y/lk23rN0TMefmxbGUYR2CJF1x5cGv0Cl+s8RtJ/3OcpNmiZoystRvWhMbySClAQJBAN3ewdzK5i/T/kXXEmNkptQO0AI0eNdj9v0s2NWIDj7q7yE8OK7U4cPv+E7qvzq3IrJATwRFJUzZ4xsqAvLjTOUCQQCkio+mhoY+p/VmNeYvGMNz9RnMevQplhKhtMj9sPI/cfg0EEhdoktsoG1Gfnn6u+dRqVl/DGa0LuHEBmODO9FfAkAIIAA5dbS4S6skI5wox6bUXTaA3isOuDpzSxElwLXE2BWpwerRfDpIUqFlQnN+UvaSUIiUP3P+PHx0ojU5b9mBAkBZ8m0IyW1FfyeFUl2czVq7XvdVcrlaqnFQ+LUPCdXDnRfjzirhFMFKhoB2Etm3mVSgrYUBENRsF1zPffaUXPTdAkBsy1U3YULc1lbgIZoa5N+nn60IbEuLkcW22DM+GGS+BejCR4cGF/4NPw6yVLEikGGxvaX6jg+/jAoF0GDlYmVH";
+$sxfPublic =
+    "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOmsrFtFPTnEzfpJ/hDl5RODBxw4i9Ex3NmmG/N7A1+by032zZZgLLpdNh8y5otjFY0E37Nyr4FGKFRSSuDiTk8vfx3pv6ImS1Rxjjg4qdVHIfqhCeB0Z2ZPuBD3Gbj8hHFEtXZq8+msAFu/5ZQjiVhgs5WWBjh54LYWSum+d9+wIDAQAB";
+$aopClient = new AopClient();
+	$array = [
+            //业务参数
+            "mno"=> "399190910000387", //商户编号
+		    //下面两个至少传一个
+		    "ordNo"=> "", //商户订单号
+		    "uuid"=> "" //科技公司订单号
+	];
+
+	$reqBean = [
+		"orgId" =>"26680846",
+		"reqData"=>$array,
+		"reqId" => time(),
+		"signType" => "RSA",
+		"timestamp" => date("Y-m-d h:i:s"),
+		"version" => "1.0",
+	];
+
+
+	$signContent = $aopClient->generateSign($reqBean,$privateKey);
+	$sign =["sign" => $signContent];
+	$reqStr = array_merge($reqBean, $sign);
+	$reqStr = json_encode($reqStr,320);
+	$requestUrl = 'https://openapi-test.tianquetech.com/query/refundQuery';
+	$resp = $aopClient->curl($requestUrl, $reqStr);
+	$result = json_decode($resp,320);
+	print_r($result);
+	$signResult = $result["sign"];
+	//  result.remove("sign");
+	unset($result["sign"]);
+	//  String resultStr = RSASignature.getOrderContent(result);
+
+	//sign
+	/// String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, privateKey));
+	$signContent = $aopClient->getSignContent($result);
+
+	$verify = $aopClient->verify($signContent, $signResult,$sxfPublic);
+	//组装加密串
+	if ($verify) {
+		echo("验签成功");
+	}else{
+		echo("验签失败");
+	}
+?>

+ 92 - 0
app/phpPay/TradeReverseScan.php

@@ -0,0 +1,92 @@
+<?php
+//交易被扫(B扫C)
+header("Content-type: text/html; charset=utf-8");
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'AopClient.php';
+
+$privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAI6aysW0U9OcTN+kn+EOXlE4MHHDiL0THc2aYb83sDX5vLTfbNlmAsul02HzLmi2MVjQTfs3KvgUYoVFJK4OJOTy9/Hem/oiZLVHGOODip1Uch+qEJ4HRnZk+4EPcZuPyEcUS1dmrz6awAW7/llCOJWGCzlZYGOHngthZK6b5337AgMBAAECgYAEqku37A5R/esF5fzVAANV5OCw2BTBGr7+2u4Xs1qwaVsjD6wf8JZm0yX3Ll12T3+NyELE1SkytHgEpB5vE0dhqW0BEft+Z0RWERxyszAbW2y/lk23rN0TMefmxbGUYR2CJF1x5cGv0Cl+s8RtJ/3OcpNmiZoystRvWhMbySClAQJBAN3ewdzK5i/T/kXXEmNkptQO0AI0eNdj9v0s2NWIDj7q7yE8OK7U4cPv+E7qvzq3IrJATwRFJUzZ4xsqAvLjTOUCQQCkio+mhoY+p/VmNeYvGMNz9RnMevQplhKhtMj9sPI/cfg0EEhdoktsoG1Gfnn6u+dRqVl/DGa0LuHEBmODO9FfAkAIIAA5dbS4S6skI5wox6bUXTaA3isOuDpzSxElwLXE2BWpwerRfDpIUqFlQnN+UvaSUIiUP3P+PHx0ojU5b9mBAkBZ8m0IyW1FfyeFUl2czVq7XvdVcrlaqnFQ+LUPCdXDnRfjzirhFMFKhoB2Etm3mVSgrYUBENRsF1zPffaUXPTdAkBsy1U3YULc1lbgIZoa5N+nn60IbEuLkcW22DM+GGS+BejCR4cGF/4NPw6yVLEikGGxvaX6jg+/jAoF0GDlYmVH";
+$sxfPublic =
+    "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOmsrFtFPTnEzfpJ/hDl5RODBxw4i9Ex3NmmG/N7A1+by032zZZgLLpdNh8y5otjFY0E37Nyr4FGKFRSSuDiTk8vfx3pv6ImS1Rxjjg4qdVHIfqhCeB0Z2ZPuBD3Gbj8hHFEtXZq8+msAFu/5ZQjiVhgs5WWBjh54LYWSum+d9+wIDAQAB";
+$aopClient = new AopClient();
+	$array = [
+            //业务参数
+            "mno"=> "399190910000387", //商户编号
+		    "ordNo"=> time(), //商户订单号
+		    //"subMechId"=> "", //子商户号
+		    //"subAppid"=> "", //微信 subAppId
+			"amt"=> "0.02", //订单总金额
+			"authCode"=> "28763400000664394", //授权码
+			//"discountAmt"=> "", //参与优惠金额
+			//"unDiscountAmt"=> "", //不参与优惠金额
+			"payType"=> "WECHAT", //支付渠道
+			"scene"=> "3", ////支付场景,1: 刷卡 2:声波 3:刷脸   不上传默认为 1
+			"subject"=> "B扫C测试",
+            "tradeSource"=> "01", //交易来源 01服务商,02收银台,03硬件
+			"trmIp"=> "127.0.0.1",
+			//"hbFqNum"=> "6", //花呗分期数,仅可上送 6 或 12
+			//"hbFqPercent"=> "0", //卖家承担分期 服务费比例,仅支持上送 0 或 100
+			//"limitPay"=> "00", //限制卡类型: 00-全部 01-限定不能使 用信用卡支付 默认值 00
+			//"timeExpire"=> "10", //订单失效时间
+			//"goodsTag"=> "00", //订单优惠标识 00:是,01: 否
+			//"couponDetail"=> "", //优惠详情信息,见下面三个字段
+			//"costPrice"=> "200", //订单原价保留两 位小数;微信 独有
+			//"receiptId"=> "123456789", //商品小票
+			//"goodsDetail"=> "123456789", //单品优惠信息使用 json 数组格式提交
+			//"goodsId"=> "200", //商品编码
+			//"thirdGoodsId"=> "12345678", //微信/支付宝侧商品码
+			//"goodsName"=> "苹果电脑", //商品名称
+			//"quantity"=> "1", //商品数量
+			//"price"=> "1.01", //商品单价
+			//"goodsCategory"=> "", //商品类目;支 付宝独有
+			//"categoriesTree"=> "124868003|126232002|126252004", //商品类目树
+			//"goodsDesc"=> "", //商品描述;支 付宝独有
+			//"showUrl"=> "", //商品展示地址 url;支付宝独有
+			//"needReceipt"=> "00", //电子发票功能 微信开具电子 发票使用
+			//"ledgerAccountFlag"=> "00", //是否做分账 分账交易使 用;00:做; 01:不做;不传默认为不做分账
+			//"ledgerAccountEffectTime"=> "00", //分账有效时间 单位为天;是 否做分账选择 00 时该字段必传
+			//"notifyUrl"=> "", //回调地址
+			//"ylTrmNo"=> "", //银联终端号
+			//"terminalId"=> "", //TQ机具编号
+			//"deviceNo"=> "", //设备号
+			//"identityFlag"=> "", //是否是实名支付
+			//"buyerIdType"=> "IDCARD", //证件类型
+			//"buyerIdNo"=> "410523198701054018", //证件号
+			//"buyerName"=> "张三", //买家姓名
+			//"mobileNum"=> "", //手机号
+			//"extend"=> "" //备用
+	];
+
+	$reqBean = [
+		"orgId" =>"26680846",
+		"reqData"=>$array,
+		"reqId" => time(),
+		"signType" => "RSA",
+		"timestamp" => date("Y-m-d h:i:s"),
+		"version" => "1.0",
+	];
+
+
+	$signContent = $aopClient->generateSign($reqBean,$privateKey);
+	$sign =["sign" => $signContent];
+	$reqStr = array_merge($reqBean, $sign);
+	$reqStr = json_encode($reqStr,320);
+	$requestUrl = 'https://openapi-test.tianquetech.com/order/reverseScan';
+	$resp = $aopClient->curl($requestUrl, $reqStr);
+	$result = json_decode($resp,320);
+	print_r($result);
+	$signResult = $result["sign"];
+	//  result.remove("sign");
+	unset($result["sign"]);
+	//  String resultStr = RSASignature.getOrderContent(result);
+
+	//sign
+	/// String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, privateKey));
+	$signContent = $aopClient->getSignContent($result);
+
+	$verify = $aopClient->verify($signContent, $signResult,$sxfPublic);
+	//组装加密串
+	if ($verify) {
+		echo("验签成功");
+	}else{
+		echo("验签失败");
+	}
+?>

+ 61 - 0
app/phpPay/UpLoadPicture.php

@@ -0,0 +1,61 @@
+<?php
+/* *
+ * 功能:支付宝手机网站alipay.trade.refund (统一收单交易退款接口)调试入口页面
+ * 版本:2.0
+ * 修改日期:2016-11-01
+ * 说明:
+ * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
+ 请确保项目文件有可写权限,不然打印不了日志。
+ */
+
+header("Content-type: text/html; charset=utf-8");
+
+Action_Upload();
+ function Action_Upload(){
+     $furl="C:\\1.jpg";
+     $url = 'https://openapi-test.tianquetech.com/merchant/uploadPicture';
+     $res =  upload_file_to_cdn($furl, $url);
+	 
+	// echo $res;
+
+}
+
+ function upload_file_to_cdn($furl,$url){
+    //  初始化
+    $ch = curl_init();
+    // 要上传的本地文件地址"@F:/xampp/php/php.ini"上传时候,上传路径前面要有@符号
+     $post_data = array (
+         //"file" =>'@D:\a.png',
+         "file" =>new CurlFile($furl),
+         'orgId'=>'26680846',  //文件类型
+         'pictureType'=>'04',
+         'reqId'=>'323ds7674354fds32fdsda60174',
+     );
+    //  设置变量
+    curl_setopt($ch, CURLOPT_URL, $url);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);//执行结果是否被返回,0是返回,1是不返回
+    curl_setopt($ch, CURLOPT_HEADER, 0);//参数设置,是否显示头部信息,1为显示,0为不显示
+    //伪造网页来源地址,伪造来自百度的表单提交
+    //表单数据,是正规的表单设置值为非0
+    curl_setopt($ch, CURLOPT_POST, 1);
+    curl_setopt($ch, CURLOPT_TIMEOUT, 100);//设置curl执行超时时间最大是多少
+    //使用数组提供post数据时,CURL组件大概是为了兼容@filename这种上传文件的写法,
+    //默认把content_type设为了multipart/form-data。虽然对于大多数web服务器并
+    //没有影响,但是还是有少部分服务器不兼容。本文得出的结论是,在没有需要上传文件的
+    //情况下,尽量对post提交的数据进行http_build_query,然后发送出去,能实现更好的兼容性,更小的请求数据包。
+     curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
+
+     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+
+    //   执行并获取结果
+     $data = curl_exec($ch);//运行curl
+    if($data === FALSE)
+    {
+        echo "<br/>"," cUrl Error:".curl_error($ch);
+    }
+    //  释放cURL句柄
+    curl_close($ch);
+}
+
+?>

+ 1 - 1
config/app.php

@@ -27,7 +27,7 @@ return [
     // 自动多应用模式
     'auto_multi_app'   => true,
     // 应用映射(自动多应用模式有效)
-    'app_map'          => ['*'=>'', 'api'=>'api', 'admin'=>'admin','wap'=>'wap', 'register' => 'register'],
+    'app_map'          => ['*'=>'', 'api'=>'api', 'admin'=>'admin','wap'=>'wap', 'register' => 'register', 'phpPay' => 'phppay'],
     // 域名绑定(自动多应用模式有效)
     'domain_bind'      => [],
     // 禁止URL访问的应用列表(自动多应用模式有效)

+ 2 - 2
route/api/route.php

@@ -14,7 +14,7 @@ Route::get('verify_code', 'AuthController/verifyCode')->name('verifyCode')
 Route::post('login/mobile', 'AuthController/mobile')->name('loginMobile')
     ->middleware(\app\http\middleware\AllowOriginMiddleware::class);
 //手机号登录
-Route::post('login/app_auth', 'AuthController/app_auth')->name('app_auth')
+Route::get('wechat/appauth', 'AuthController/app_auth')->name('app_auth')
     ->middleware(\app\http\middleware\AllowOriginMiddleware::class);
 // 微信登录
 
@@ -35,6 +35,7 @@ Route::post('register/reset', 'AuthController/reset')->name('registerReset')
 Route::any('wechat/serve', 'wechat.WechatController/serve');//公众号服务
 Route::any('wechat/notify', 'wechat.WechatController/notify');//公众号支付回调
 Route::any('routine/notify', 'wechat.AuthController/notify');//小程序支付回调
+Route::any('alipay/notify', 'AlipayController/notify');//支付支付回调
 
 //管理员订单操作类
 Route::group(function () {
@@ -256,7 +257,6 @@ Route::group(function () {
     Route::get('store_list', 'PublicController/store_list')->name('storeList');
     //获取城市列表
     Route::get('city_list', 'PublicController/city_list')->name('cityList');
-    Route::any('alipay/notify', 'AlipayController/notify');//支付支付回调
     Route::get('version', 'PublicController/version')->name('version'); // 版本更新
 })->middleware(\app\http\middleware\AllowOriginMiddleware::class)->middleware(\app\http\middleware\AuthTokenMiddleware::class, false);