From 59ca26e6cec8ba5f83dd19dd11e4e73653a3a010 Mon Sep 17 00:00:00 2001 From: devil_gong Date: Tue, 29 Oct 2019 14:34:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=B4=E6=9D=A1=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/api/controller/Toutiao.php | 56 ++++++++++ application/api/controller/User.php | 2 +- application/lang/zh-cn.php | 1 + application/service/ToutiaoService.php | 105 ++++++++++++++++++ extend/base/{ToutiaoAuth.php => Toutiao.php} | 29 ++++- extend/payment/Alipay.php | 84 +++++++++++++- public/appmini/old/toutiao/app.js | 2 +- .../toutiao/pages/user-order/user-order.js | 39 ++++--- 8 files changed, 288 insertions(+), 30 deletions(-) create mode 100644 application/api/controller/Toutiao.php create mode 100644 application/service/ToutiaoService.php rename extend/base/{ToutiaoAuth.php => Toutiao.php} (70%) diff --git a/application/api/controller/Toutiao.php b/application/api/controller/Toutiao.php new file mode 100644 index 000000000..d14c4498f --- /dev/null +++ b/application/api/controller/Toutiao.php @@ -0,0 +1,56 @@ +IsLogin(); + } + + /** + * 订单支付 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2019-10-29 + * @desc description + */ + public function Pay() + { + // 获取支付信息 + $params = $this->data_post; + $params['user'] = $this->user; + return ToutiaoService::Pay($params); + } +} +?> \ No newline at end of file diff --git a/application/api/controller/User.php b/application/api/controller/User.php index 3b8ed8350..51b420b77 100755 --- a/application/api/controller/User.php +++ b/application/api/controller/User.php @@ -262,7 +262,7 @@ class User extends Common 'appid' => MyC('common_app_mini_toutiao_appid', 'tt65341389fa1e87f3'), 'secret' => MyC('common_app_mini_toutiao_appsecret', '9ea496422c189390d2d3ec8eec597fbcf3e1e5a7'), ]; - $result = (new \base\ToutiaoAuth())->GetAuthCode($this->data_post); + $result = (new \base\Toutiao())->GetAuthCode($this->data_post); if($result['status'] == 0) { return DataReturn('授权登录成功', 0, $result['data']['openid']); diff --git a/application/lang/zh-cn.php b/application/lang/zh-cn.php index e71001c65..2d4059156 100755 --- a/application/lang/zh-cn.php +++ b/application/lang/zh-cn.php @@ -128,6 +128,7 @@ return array( 'alipay' => array('value' => 'alipay', 'name' => '支付宝小程序'), 'weixin' => array('value' => 'weixin', 'name' => '微信小程序'), 'baidu' => array('value' => 'baidu', 'name' => '百度小程序'), + 'toutiao' => array('value' => 'toutiao', 'name' => '头条小程序'), ), // 小程序url跳转类型 diff --git a/application/service/ToutiaoService.php b/application/service/ToutiaoService.php new file mode 100644 index 000000000..8ed7bee8e --- /dev/null +++ b/application/service/ToutiaoService.php @@ -0,0 +1,105 @@ +intval($params['id']), 'user_id' => $params['user']['id']]; + $order = Db::name('Order')->where($where)->find(); + + // 支付方式 + $payment_id = empty($params['payment_id']) ? $order['payment_id'] : intval($params['payment_id']); + $payment = PaymentService::PaymentList(['where'=>['id'=>$payment_id]]); + + // 头条需要的订单信息 + $merchant_id = '1900017261'; + $app_id = '800172615976'; + $secret = '4xi2kcrzgancnanghtafqtqrwgy5534itichypud'; + $order_info = [ + 'merchant_id' => $merchant_id, + 'app_id' => $app_id, + 'sign_type' => 'MD5', + 'timestamp' => time(), + 'version' => '2.0', + 'trade_type' => 'H5', + 'product_code' => 'pay', + 'payment_type' => 'direct', + 'outorderno' => $order['order_no'], + 'uid' => md5($params['user']['id']), + 'total_amount' => intval($order['total_price']*100), + 'currency' => 'CNY', + 'subject' => '订单支付', + 'body' => $order['order_no'], + 'trade_time' => $order['add_time'], + 'valid_time' => $order['add_time']+(intval(MyC('common_order_close_limit_time', 30, true))*60), + 'notify_url' => __MY_URL__, + ]; + $order_info['sign'] = (new \base\Toutiao())->PaySignCreated($order_info, $secret); + + // 支付方式 + $service = 1; + switch($payment[0]['payment']) + { + // 微信 + case 'Weixin' : + $service = 3; + $order_info['wx_url'] = $ret['data']['data']; + $order_info['wx_type'] = 'MWEB'; + break; + + // 支付宝 + case 'Alipay' : + $service = 4; + $order_info['alipay_url'] = $ret['data']['data']; + break; + } + + // 返回数据 + $result = [ + 'order_info' => $order_info, + 'service' => $service, + 'is_online_pay' => $ret['data']['is_online_pay'], + ]; + return DataReturn('success', 0, $result); + print_r($result);die; + } +} +?> \ No newline at end of file diff --git a/extend/base/ToutiaoAuth.php b/extend/base/Toutiao.php similarity index 70% rename from extend/base/ToutiaoAuth.php rename to extend/base/Toutiao.php index e9c1d0a4c..dac1ef06a 100644 --- a/extend/base/ToutiaoAuth.php +++ b/extend/base/Toutiao.php @@ -11,11 +11,11 @@ namespace base; /** - * 头条用户授权驱动 + * 头条驱动 * @author Devil * @version V_1.0.0 */ -class ToutiaoAuth +class Toutiao { /** * [__construct 构造方法] @@ -51,5 +51,30 @@ class ToutiaoAuth } return ['status'=>0, 'msg'=>'授权成功', 'data'=>$result]; } + + /** + * 支付签名生成 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2019-10-29 + * @desc description + * @param [array] $data [需要生成签名的数据] + * @param [string] $secret [密钥] + */ + public function PaySignCreated($data, $secret) + { + ksort($data); + $sign = ''; + foreach($data AS $key=>$val) + { + if($key != 'sign' && $key != 'risk_info' && $val != '' && $val != null) + { + $sign .= "$key=$val&"; + } + } + $sign = substr($sign, 0, -1); + return md5($sign.$secret); + } } ?> \ No newline at end of file diff --git a/extend/payment/Alipay.php b/extend/payment/Alipay.php index 68e7e57a1..7f7a1a1c3 100755 --- a/extend/payment/Alipay.php +++ b/extend/payment/Alipay.php @@ -52,7 +52,7 @@ class Alipay 'name' => '支付宝', // 插件名称 'version' => '1.1.0', // 插件版本 'apply_version' => '不限', // 适用系统版本描述 - 'apply_terminal'=> ['pc','h5'], // 适用终端 默认全部 ['pc', 'h5', 'app', 'alipay', 'weixin', 'baidu'] + 'apply_terminal'=> ['pc','h5', 'ios', 'android', 'toutiao'], // 适用终端 默认全部 ['pc', 'h5', 'ios', 'android', 'alipay', 'weixin', 'baidu', 'toutiao'] 'desc' => '2.0版本,适用PC+H5,即时到帐支付方式,买家的交易资金直接打入卖家支付宝账户,快速回笼交易资金。 立即申请', // 插件描述(支持html) 'author' => 'Devil', // 开发者 'author_url' => 'http://shopxo.net/', // 开发者主页 @@ -131,16 +131,88 @@ class Alipay return DataReturn('支付缺少配置', -1); } - // 手机/PC - if(IsMobile()) + // 支付方式 + switch(APPLICATION_CLIENT_TYPE) { - $ret = $this->PayMobile($params); - } else { - $ret = $this->PayWeb($params); + // web + case 'pc' : + case 'h5' : + if(IsMobile()) + { + $ret = $this->PayMobile($params); + } else { + $ret = $this->PayWeb($params); + } + break; + + // app,头条小程序 + case 'ios' : + case 'android' : + case 'toutiao' : + $ret = $this->PayApp($params); + break; + + default : + $ret = DataReturn('没有相关支付模块['.APPLICATION_CLIENT_TYPE.']', -1); } + return $ret; } + /** + * app支付 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2019-10-29 + * @desc description + * @param [array] $params [输入参数] + */ + private function PayApp($params = []) + { + // 支付参数 + $parameter = array( + 'app_id' => $this->config['appid'], + 'method' => 'alipay.trade.app.pay', + 'format' => 'JSON', + 'charset' => 'utf-8', + 'sign_type' => 'RSA2', + 'timestamp' => date('Y-m-d H:i:s'), + 'version' => '1.0', + 'return_url' => $params['call_back_url'], + 'notify_url' => $params['notify_url'], + ); + $biz_content = array( + 'product_code' => 'QUICK_MSECURITY_PAY', + 'subject' => $params['name'], + 'out_trade_no' => $params['order_no'], + 'total_amount' => $params['total_price'], + ); + $parameter['biz_content'] = json_encode($biz_content, JSON_UNESCAPED_UNICODE); + + // 生成签名参数+签名 + $parameter['sign'] = $this->MyRsaSign($this->GetSignContent($parameter)); + + // 生成支付参数 + $value = ''; + $i = 0; + foreach($parameter as $k=>$v) + { + if($v != '' && $v != null && "@" != substr($v, 0, 1)) + { + if($i == 0) + { + $value .= $k.'='.urlencode($v); + } else { + $value .= '&'.$k.'='.urlencode($v); + } + $i++; + } + } + unset($k, $v); + return DataReturn('处理成功', 0, $value); + } + /** * [PayMobile wap手机支付] * @author Devil diff --git a/public/appmini/old/toutiao/app.js b/public/appmini/old/toutiao/app.js index 77d4129f5..2c7cd6d1c 100755 --- a/public/appmini/old/toutiao/app.js +++ b/public/appmini/old/toutiao/app.js @@ -67,7 +67,7 @@ App({ // 请求地址 request_url: "{{request_url}}", request_url: 'http://tp5-dev.com/', - request_url: 'https://test.shopxo.net/', + //request_url: 'https://test.shopxo.net/', // 基础信息 application_title: "{{application_title}}", diff --git a/public/appmini/old/toutiao/pages/user-order/user-order.js b/public/appmini/old/toutiao/pages/user-order/user-order.js index 0d90a836a..256e5a2c8 100755 --- a/public/appmini/old/toutiao/pages/user-order/user-order.js +++ b/public/appmini/old/toutiao/pages/user-order/user-order.js @@ -215,7 +215,7 @@ Page({ tt.showLoading({title: "请求中..." }); tt.request({ - url: app.get_request_url("pay", "order"), + url: app.get_request_url("pay", "toutiao"), method: "POST", data: { id: order_id, @@ -234,27 +234,26 @@ Page({ app.showToast("支付成功", "success"); } else { - tt.requestPayment({ - timeStamp: res.data.data.data.timeStamp, - nonceStr: res.data.data.data.nonceStr, - package: res.data.data.data.package, - signType: res.data.data.data.signType, - paySign: res.data.data.data.paySign, - success: function(res) { - // 数据设置 - var temp_data_list = self.data.data_list; - temp_data_list[index]['status'] = 2; - temp_data_list[index]['status_name'] = '待发货'; - self.setData({ data_list: temp_data_list }); - - // 跳转支付页面 - tt.navigateTo({ - url: "/pages/paytips/paytips?code=9000&total_price=" + - self.data.data_list[index]['total_price'] + tt.pay({ + orderInfo: res.data.data.order_info, + service: res.data.data.service, + getOrderStatus(res) { + let { out_order_no } = res; + return new Promise(function(resolve, reject) { + // 商户前端根据 out_order_no 请求商户后端查询微信支付订单状态 + console.log('getOrderStatus') }); }, - fail: function (res) { - app.showToast('支付失败'); + success(res) { + console.log(res, 'pay-success') + if (res.code == 0) { + // 支付成功处理逻辑,只有res.code=0时,才表示支付成功 + // 但是最终状态要以商户后端结果为准 + } + }, + fail(res) { + console.log(res, 'pay-fail') + // 调起收银台失败处理逻辑 } }); } -- GitLab