其他第三方支付
这里指除支付宝微信官方支付渠道外的其他支付渠道,可以参考本文档进行完成。
案例指引
以
NewPay
支付为例,制作一个插件来完成系统支付。
支付场景
目前系统支付有购买商品支付和充值支付,那么只需要完成这两个场景下的方法接入即可。
创建支付类
新建一个文件
NewPayController.php
,放到app/home/plugins
下面
将下面的代码复制进去
<?php
namespace app\home\plugins;
use app\home\c\CommonController;
class NewPayController extends CommonController
{
function _init(){
parent::_init();
//相关配置放到这个地方,请根据第三方支付文档进行配置
$this->payconfig = [
'appid'=>'',
'appsecret'=>''
];
}
/*
主支付函数
业务逻辑:
用户前台选择了 NewPay 进行下单支付,然后系统创建订单,带着相关订单参数跳转到这个函数,进行支付
构建支付链接:
http://域名/newPay/pay?orderno=订单号&username=用户名&&tel=联系方式&email=联系邮箱&address=联系地址
orderno为主要参数,其他参数可以不用,看前台表单填写情况而定
*/
function pay(){
//保存提交信息
$return_url = U('user/orderdetails',['orderno'=>$this->frparam('orderno',1)]);
$w['orderno'] = $this->frparam('orderno',1);
$w['receive_username'] = $this->frparam('username',1);
$w['receive_tel'] = $this->frparam('tel',1);
$w['receive_email'] = $this->frparam('email',1);
$w['receive_address'] = $this->frparam('address',1);
$paytype = $this->frparam('paytype',0,1);//默认支付宝支付1,2微信支付
$order = M('orders')->find(['orderno'=>$w['orderno']]);
if(!$order || !$w['orderno']){
if($this->frparam('ajax')){
JsonReturn(['code'=>1,'msg'=>'订单号不存在或已被删除!','url'=>$return_url]);
}
Error('订单号不存在或已被删除!',$return_url);
}
//保存信息
$res = M('orders')->update(['id'=>$order['id']],$w);
//此处开始进行配置第三方支付功能
$orderno = $this->frparam('orderno',1);
$payment = 'NewPay';
$appid = $this->payconfig['appid'];
$appsecret = $this->payconfig['appsecret'];
M('orders')->update(['id'=>$order['id']],['paytype'=>$payment]);
$title = '支付订单:'.$orderno;
//以下进行拼接支付信息,执行业务逻辑
$data=array(
'appid' => $appid, //必须的,APPID
'trade_order_id'=> $orderno, //必须的,网站订单ID,唯一的,匹配[a-zA-Z\d\-_]+
'payment' => $payment,//必须的,支付接口标识:wechat(微信接口)|alipay(支付宝接口)
'total_fee' => $order['price'],//人民币,单位精确到分(测试账户只支持0.1元内付款)
'title' => $title, //必须的,订单标题,长度32或以内
'time' => time(),//必须的,当前时间戳,根据此字段判断订单请求是否已超时,防止第三方攻击服务器
//...
);
//进行编写业务逻辑
}
//支付查询,检查订单是否支付,可以自定义支付函数,此函数为示例代码
function checkpay(){
$orderno = $this->frparam('orderno',1);
if(!$orderno){
exit('链接错误!');
}
$order = M('orders')->find(['orderno'=>$orderno]);
if(!$order){
exit('未查询到此订单号!');
}
unset($order['userid']);
unset($order['jifen']);
unset($order['qianbao']);
unset($order['send_time']);
unset($order['tid']);
unset($order['discount']);
unset($order['yunfei']);
unset($order['username']);
unset($order['tel']);
if($order['ispay']==1){
$this->overpay($orderno);exit;
}
//这里进行配置第三方支付验证
}
//支付完成跳转
private function overpay($orderno){
$order = M('orders')->find(['orderno'=>$orderno,'ispay'=>1]);
if($orderno && $order){
$this->order = $order;
$this->display($this->template.'/paytpl/overpay');
}else{
exit('订单未支付或订单号错误!');
}
}
}
前端页面代码
找到模板文件夹,打开 user/payment.html
,修改如下代码:
<div class="payment">
<select name="paytypeselect" id="paytype">
{if($webconf['isopenzfb'])}
<option value="1">支付宝(需付:{$order['price']})</option>
<option value="5">支付宝当面付(需付:{$order['price']})</option>
{/if}
{if($webconf['isopenweixin'])}
<option value="2">微信(需付:{$order['price']})</option>
{/if}
{if($webconf['isopenqianbao'])}
<option value="3">钱包(需付:{$qianbao} 余额:{$member['money']})</option>
{/if}
{if($webconf['isopenjifen'])}
<option value="4">积分(需付:{$jifen} 余额:{$member['jifen']})</option>
{/if}
<option value="8">NewPay</option>
</select>
</div>
<input name="c" type="hidden" value="NewPay" />
注意事项: 新增的支付类型值
paytypeselect
,必须大于等于6
增加的c
参数值是前面新建控制器的名称
找到 user/buy.html
文件并打开,修改如下代码:
function checkform(){
if(parseFloat($("#allmoney").val())<=0){
alert('输入数量错误!');return false;
}
$.post("{fun U('user/buy')}",{allmoney:$("#allmoney").val(),paytype:$("#paytype").val(),number:$("#money").val(),buytarget:$("#buytarget").val()},function(res){
console.log(res);
if(res.code==0){
//var url = "{fun U('order/pay')}?go=1&orderno="+res['data'].orderno+"&paytype="+res['data'].paytype;
//此处修改paytype的值,同上,必须大于等于 6 ,这样支付的跳转地址就会到自定义的支付类里面
var url = "{fun U('order/pay')}?go=1&orderno="+res['data'].orderno+"&paytype=8";
window.location.href = url;
}else{
alert(res.msg);
}
},'json');
return false;
}
页面其他代码自行删减修改
完成接入
以上就完成了订单支付和充值支付的接入了,是不是很简单?