...
|
...
|
@@ -3,9 +3,9 @@ |
|
|
namespace app\portal\controller;
|
|
|
|
|
|
use cmf\controller\HomeBaseController;
|
|
|
use EasyWeChat\Foundation\Application;
|
|
|
use EasyWeChat\Payment\Order;
|
|
|
use think\Db;
|
|
|
use think\Log;
|
|
|
use think\Validate;
|
|
|
|
|
|
/**
|
|
|
* 微信支付,退款,提现DEMO
|
...
|
...
|
@@ -14,67 +14,142 @@ use think\Validate; |
|
|
*/
|
|
|
class PayController extends HomeBaseController
|
|
|
{
|
|
|
protected $options;
|
|
|
function _initialize()
|
|
|
{
|
|
|
parent::_initialize();
|
|
|
$this->options = [
|
|
|
'app_id' => config('wechat_config.app_id'), // AppID
|
|
|
'secret' => config('wechat_config.secret'), // AppSecret
|
|
|
// payment
|
|
|
'payment' => config('wechat_config.payment'),
|
|
|
];
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 微信支付
|
|
|
*/
|
|
|
public function index(){
|
|
|
$attributes = [
|
|
|
'trade_type' => 'JSAPI',
|
|
|
'body' => '百荣科技',
|
|
|
'detail' => '以客户为中心 以奋斗者文本',
|
|
|
'out_trade_no' => cmf_get_order_sn(),
|
|
|
'total_fee' => 1, // 单位:分
|
|
|
'notify_url' => url('portal/pay/notify','','',true), // 支付结果通知网址,如果不设置则会使用配置里的默认地址
|
|
|
'openid' => cmf_get_current_user_openid(), // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,
|
|
|
];
|
|
|
$order = new Order($attributes);
|
|
|
|
|
|
$app = new Application($this->options);
|
|
|
$payment = $app->payment;
|
|
|
$result = $payment->prepare($order);
|
|
|
|
|
|
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){
|
|
|
$prepayId = $result->prepay_id;
|
|
|
$jsApiParameters=$payment->configForJSSDKPayment($prepayId);
|
|
|
$this->assign('jsApiParameters',json_encode($jsApiParameters));
|
|
|
return $this->fetch();
|
|
|
}else{
|
|
|
$this->error('支付参数错误','',$result);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 支付回调
|
|
|
* @throws \EasyWeChat\Core\Exceptions\FaultException
|
|
|
*/
|
|
|
public function notify(){
|
|
|
cache('nnn',111);
|
|
|
$app = new Application($this->options);
|
|
|
$response = $app->payment->handleNotify(function($notify, $successful){
|
|
|
cache('notify',$notify);
|
|
|
cache('successful',$successful);
|
|
|
/*这里是支付回调逻辑处理,一下是DEMO*/
|
|
|
|
|
|
// // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
|
|
|
// $out_trade_no=$notify->out_trade_no;
|
|
|
// $order = Db::name('order')->where('order_sn',$out_trade_no)->find();
|
|
|
// if (!$order) { // 如果订单不存在
|
|
|
// return 'Order not exist.'; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
|
|
|
// }
|
|
|
// // 如果订单存在
|
|
|
// // 检查订单是否已经更新过支付状态
|
|
|
// if ($order['pay_time']>0) { // 假设订单字段“支付时间”不为空代表已经支付
|
|
|
// return true; // 已经支付成功了就不再更新了
|
|
|
// }
|
|
|
//
|
|
|
// // 用户是否支付成功
|
|
|
// if ($successful) {
|
|
|
// // 回填微信的订单号
|
|
|
// $update['transaction_id']=$notify->transaction_id;
|
|
|
// $update['pay_time']=time();
|
|
|
// // 不是已经支付状态则修改为已经支付状态
|
|
|
// $update['status'] = 2;
|
|
|
// } else { // 用户支付失败
|
|
|
// $update['status']=9;
|
|
|
// }
|
|
|
// Db::name('order')->where('order_sn',$out_trade_no)->update($update);
|
|
|
|
|
|
return true; // 返回处理完成
|
|
|
});
|
|
|
|
|
|
$response->send();
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 查询订单
|
|
|
*/
|
|
|
public function checkOrder(){
|
|
|
$app = new Application($this->options);
|
|
|
$payment = $app->payment;
|
|
|
$orderNo = "2018080210097519";//商户系统内部的订单号(out_trade_no)
|
|
|
$result=$payment->query($orderNo);
|
|
|
var_dump($result);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 退款
|
|
|
* @throws \WxPayException
|
|
|
*/
|
|
|
public function refund(){
|
|
|
$param = $this->request->param();
|
|
|
//todo 退款逻辑应该加入百荣签名验证规则,避免出现被盗用
|
|
|
/*$param=$this->request->param();
|
|
|
$signature = $param['s'];
|
|
|
$arithmetic['timeStamp']= $param['t'];
|
|
|
$arithmetic['randomStr']= $param['r'];
|
|
|
$arithmetic['orderSn']= $param['o'];
|
|
|
$str = arithmetic($arithmetic);
|
|
|
if($str != $signature){
|
|
|
$this->error('签名验证失败');
|
|
|
}
|
|
|
|
|
|
/*微信退款*/
|
|
|
require_once EXTEND_PATH."WxpayAPI/lib/WxPay.Api.php";
|
|
|
require_once EXTEND_PATH."WxpayAPI/example/log.php";
|
|
|
if(isset($info["transaction_id"]) && empty($info["transaction_id"])){
|
|
|
$transaction_id = $info["transaction_id"];
|
|
|
$total_fee = $info["real_price"]*100;
|
|
|
$refund_fee = $info["real_price"]*100;
|
|
|
$input = new \WxPayRefund();
|
|
|
$input->SetTransaction_id($transaction_id);
|
|
|
$input->SetTotal_fee($total_fee);
|
|
|
$input->SetRefund_fee($refund_fee);
|
|
|
$input->SetOut_refund_no(\WxPayConfig::MCHID.date("YmdHis"));
|
|
|
$input->SetOp_user_id(\WxPayConfig::MCHID);
|
|
|
$ret=\WxPayApi::refund($input);
|
|
|
if($ret['result_code']=='SUCCESS'){
|
|
|
//todo 退款成功处理
|
|
|
$this->success('退款成功');
|
|
|
}else{
|
|
|
$this->error("退款失败:".$ret['err_code_des']);
|
|
|
}
|
|
|
}else{
|
|
|
$this->error('缺少退款标识');
|
|
|
}
|
|
|
$this->error('签名验证失败');
|
|
|
}*/
|
|
|
$app = new Application($this->options);
|
|
|
$payment = $app->payment;
|
|
|
//使用商户订单号退款 PS.其他形式参考文档
|
|
|
$orderNo = "2018080210097519";//商户系统内部的订单号(out_trade_no)
|
|
|
$refundNo = cmf_get_order_sn();//退款单号
|
|
|
$result = $payment->refund($orderNo, $refundNo, 100, 80); // 总金额 100, 退款 80,refundFee可选(为空时全额退款)
|
|
|
var_dump($result);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 查询退款
|
|
|
*/
|
|
|
public function checkRefund(){
|
|
|
$app = new Application($this->options);
|
|
|
$payment = $app->payment;
|
|
|
$outTradeNo="2018080210097519";//商户系统内部的订单号(out_trade_no)
|
|
|
$result = $payment->queryRefund($outTradeNo);
|
|
|
var_dump($result);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 提现
|
|
|
* 红包
|
|
|
*/
|
|
|
public function withdraw_cash(){
|
|
|
$param = $this->request->param();
|
|
|
public function luckyMoney(){
|
|
|
//todo 退款逻辑应该加入百荣签名验证规则,避免出现被盗用
|
|
|
/*$param=$this->request->param();
|
|
|
$signature = $param['s'];
|
|
|
$arithmetic['timeStamp']= $param['t'];
|
|
|
$arithmetic['randomStr']= $param['r'];
|
...
|
...
|
@@ -82,19 +157,51 @@ class PayController extends HomeBaseController |
|
|
$str = arithmetic($arithmetic);
|
|
|
if($str != $signature){
|
|
|
$this->error('签名验证失败');
|
|
|
}
|
|
|
$price=1;
|
|
|
$openid='';
|
|
|
|
|
|
$merch=new \MerchPay();
|
|
|
$trade_no = cmf_get_order_sn();
|
|
|
$res=$merch->pay($openid,$trade_no,$price,'提现');
|
|
|
if($res['result_code']=='SUCCESS'){
|
|
|
//todo 提现成功处理
|
|
|
}else{
|
|
|
$this->error('操作失败:'.$res['return_msg']);
|
|
|
}
|
|
|
}*/
|
|
|
|
|
|
$app = new Application($this->options);
|
|
|
$luckyMoney = $app->lucky_money;
|
|
|
$luckyMoneyData = [
|
|
|
'mch_billno' => 'xy123456',
|
|
|
'send_name' => '测试红包',
|
|
|
're_openid' => 'oxTWIuGaIt6gTKsQRLau2M0yL16E',
|
|
|
'total_num' => 1, //普通红包固定为1,裂变红包不小于3
|
|
|
'total_amount' => 100, //单位为分,普通红包不小于100,裂变红包不小于300
|
|
|
'wishing' => '祝福语',
|
|
|
'client_ip' => '192.168.0.1', //可不传,不传则由 SDK 取当前客户端 IP
|
|
|
'act_name' => '测试活动',
|
|
|
'remark' => '测试备注',
|
|
|
// ...
|
|
|
];
|
|
|
//普通红包
|
|
|
$result = $luckyMoney->send($luckyMoneyData, \EasyWeChat\Payment\LuckyMoney\API::TYPE_NORMAL);
|
|
|
var_dump($result);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 查询红包
|
|
|
*/
|
|
|
public function checkLuckyMoney(){
|
|
|
$mchBillNo = "商户系统内部的订单号(mch_billno)";
|
|
|
$app = new Application($this->options);
|
|
|
$luckyMoney = $app->lucky_money;
|
|
|
$luckyMoney->query($mchBillNo);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 生成签名DEMO
|
|
|
* @return string
|
|
|
*/
|
|
|
public function getSignatureDemo(){
|
|
|
$timeStamp = time();
|
|
|
$randomStr = cmf_random_string(8);
|
|
|
$arithmetic['timeStamp']= $timeStamp;
|
|
|
$arithmetic['randomStr']= $randomStr;
|
|
|
$signature = arithmetic($arithmetic);
|
|
|
$notifyParam=array('t'=>$timeStamp,'r'=>$randomStr,'s'=>$signature);
|
|
|
$url=url('your url 表达式',$notifyParam,true,true);
|
|
|
return $url;
|
|
|
}
|
|
|
|
|
|
|
|
|
} |
|
|
\ No newline at end of file |
...
|
...
|
|