mirror of
https://gitee.com/zongzhige/shopxo.git
synced 2026-06-06 16:21:54 +08:00
头条支付
This commit is contained in:
56
application/api/controller/Toutiao.php
Normal file
56
application/api/controller/Toutiao.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ShopXO 国内领先企业级B2C免费开源电商系统
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: Devil
|
||||
// +----------------------------------------------------------------------
|
||||
namespace app\api\controller;
|
||||
|
||||
use app\service\ToutiaoService;
|
||||
|
||||
/**
|
||||
* 头条定制化控制器
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 0.0.1
|
||||
* @date 2019-10-29
|
||||
*/
|
||||
class Toutiao extends Common
|
||||
{
|
||||
/**
|
||||
* [__construct 构造方法]
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 0.0.1
|
||||
* @datetime 2016-12-03T12:39:08+0800
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
// 调用父类前置方法
|
||||
parent::__construct();
|
||||
|
||||
// 是否登录
|
||||
$this->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);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@ -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']);
|
||||
|
||||
@ -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跳转类型
|
||||
|
||||
105
application/service/ToutiaoService.php
Normal file
105
application/service/ToutiaoService.php
Normal file
@ -0,0 +1,105 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ShopXO 国内领先企业级B2C免费开源电商系统
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: Devil
|
||||
// +----------------------------------------------------------------------
|
||||
namespace app\service;
|
||||
|
||||
use think\Db;
|
||||
use app\service\PaymentService;
|
||||
use app\service\OrderService;
|
||||
|
||||
/**
|
||||
* 头条定制化服务层
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 0.0.1
|
||||
* @date 2019-10-29
|
||||
*/
|
||||
class ToutiaoService
|
||||
{
|
||||
/**
|
||||
* 订单支付
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @date 2019-10-29
|
||||
* @desc description
|
||||
* @param [array] $params [输入参数]
|
||||
*/
|
||||
public static function Pay($params = [])
|
||||
{
|
||||
// 获取支付信息
|
||||
$ret = OrderService::Pay($params);
|
||||
if($ret['code'] != 0)
|
||||
{
|
||||
return $ret;
|
||||
}
|
||||
|
||||
// 获取订单信息
|
||||
$where = ['id'=>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;
|
||||
}
|
||||
}
|
||||
?>
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@ -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,即时到帐支付方式,买家的交易资金直接打入卖家支付宝账户,快速回笼交易资金。 <a href="http://www.alipay.com/" target="_blank">立即申请</a>', // 插件描述(支持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
|
||||
|
||||
@ -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}}",
|
||||
|
||||
@ -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')
|
||||
// 调起收银台失败处理逻辑
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user