提交 59ca26e6 编写于 作者: D devil_gong

头条支付

上级 6e38e86b
<?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);
}
}
?>
\ No newline at end of file
......@@ -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跳转类型
......
<?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;
}
}
?>
\ No newline at end of file
......@@ -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
......@@ -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')
// 调起收银台失败处理逻辑
}
});
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册