注:由于对接支付功能需要企业账户,这里测试用的是支付宝的沙盒环境
第一步:
打开支付宝开放平台:https://open.alipay.com/
登录后点击控制台->研发服务
这里是支付宝为我们提供的测试账号和环境
直接用系统默认的就行
下载sdk(这里我用的是pc端支付):https://opendocs.alipay.com/open/270/106291/
第二步:
沙盒环境弄好后就开始实现我们的业务逻辑
- 把下载好的sdk放到对应得目录下
- 根据自己对应得填写,这里只做同步跳转
接收前端传递过来得参数进行业务代码开发(这里用的是网页重定向方式如果没有被执行查看请求是否被浏览器拦截)
public function pay(){
$money = input('money'); //接收参数
$user_id = input('user_id');
$validate = $this->validate($money,[ //参数验证
'money|金额' => 'number'
]);
if($validate !== true){
$this->error($validate);
}
if(empty($money) || empty($user_id)){
$this->error('充值失败','home/index/idnex');
}
//生成充值记录
$order_sn = date('YmdHis').mt_rand(1111,9999);
$data = [
'user_id' => $user_id,
'money' => $money,
'add_time' => time(),
'order_sn' => $order_sn
];
$info = db('alpay')->insert($data);
if(!$info){
$this->error('充值失败','home/index/index');
}
//调用支付宝接口
echo "<form name=traderefund id='alipayment' action='/plugins/alipay/pagepay/pagepay.php' method='post' style='display:none'>
<input id='WIDout_trade_no' name='WIDout_trade_no' value='{$data['order_sn']}' />
<input id='WIDsubject' name='WIDsubject' value='会员充值' />
<input id='WIDtotal_amount' name='WIDtotal_amount' value='{$data['money']}' />
<input id='WIDbody' name='WIDbody' value='会员充值记录' />
</form><script>document.getElementById('alipayment').submit();</script>";
}
请求成功后会有一个同步跳转(在这里实现你的业务逻辑操作)
public function callback(){
$params = input();
//修改订单状态
$status = db('alpay')->where('order_sn',$params['out_trade_no'])->update([
'status'=> 1,
'pay_time' => time()
]);
if($status){
$row = db('alpay')->where('order_sn',$params['out_trade_no'])->field('user_id,money')->find();
//修改会员余额
db('member')->where('id',$row['user_id'])->setInc('balance',$row['money']);
//增加一条至今变动记录
db('account_log')->insert([
'user_id' => $row['user_id'],
'money' => $row['money'],
'change_type' => 1,
'change_time' => time(),
'change_desc' => '会员充值'
]);
}
//修改会员余额
return view('callback',['money'=>$params['total_amount']]);
}