登录支付宝设置后台:
把商户公钥填到“应用公钥”,生成支付宝公钥。
appid,商户私钥,支付宝公钥三个参数
调起支付:
//支付宝支付
import('lib.Alipay', EXTEND_PATH , '.php');
$jtpay_model = new \Alipay();
$pay_info = $jtpay_model->pay_order( $order_sn , $pay_money );
if($pay_info){
$this->success( __("Purchase success") ,[
'url' => $pay_info,
'type' => 3,
]);
}
配置参数:payment组件国内几乎都是坑爹的缺参数的同一篇文章,坑死人。
<?php
use Payment\Common\PayException;
use Payment\Client\Charge;
use Payment\Config;
class Alipay {
/**
* 发起支付
*/
public function pay_order( $orderNo , $money ) {
$aliConfig = [
'use_sandbox' => false, // 是否使用沙盒模式
'app_id' => '',
'sign_type' => 'RSA2', // RSA RSA2
// !!!注意:如果是文件方式,文件中只保留字符串,不要留下 -----BEGIN PUBLIC KEY----- 这种标记
// 可以填写文件路径,或者密钥字符串 当前字符串是 rsa2 的支付宝公钥(开放平台获取)
'ali_public_key' => '',
// 可以填写文件路径,或者密钥字符串 我的沙箱模式,rsa与rsa2的私钥相同,为了方便测试
'rsa_private_key' => '',
'limit_pay' => [
//'balance',// 余额
//'moneyFund',// 余额宝
//'debitCardExpress',// 借记卡快捷
//'creditCard',//信用卡
//'creditCardExpress',// 信用卡快捷
//'creditCardCartoon',//信用卡卡通
//'credit_group',// 信用支付类型(包含信用卡卡通、信用卡快捷、花呗、花呗分期)
], // 用户不可用指定渠道支付当有多个渠道时用“,”分隔
// 与业务相关参数
'notify_url' => 'https://n/Notify_Alipay/notify',
'return_url' => 'http://n/statics/ali.php',
'return_raw' => true, // 在处理回调时,是否直接返回原始数据,默认为 true
];
$payData = [
'body' => '翡翠', //对一笔交易的具体描述信息
'subject' => '翡翠', //商品标题
'order_no' => $orderNo,
'timeout_express' => time() + 600, // 表示必须 600s 内付款
'amount' => $money, // 单位为元 ,最小为0.01
// 'return_param' => 'tata', // 一定不要传入汉字,只能是 字母 数字组合
// 'client_ip' => isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1',// 客户地址
'goods_type' => '0', // 0—虚拟类商品,1—实物类商品
'store_id' => '',
'quit_url' => 'https://fcn/#/levelpackage', // 收银台的返回按钮(用户打断支付操作时返回的地址,4.0.3版本新增)
];
try {
$url = Charge::run(Config::ALI_CHANNEL_WAP, $aliConfig, $payData);
} catch (PayException $e) {
echo $e->errorMessage();
exit;
}
return $url;
header('Location:' . $url);
}
}
回调:
必须用implements:
<?php
namespace app\api\controller;
use app\common\controller\Api;
use think\Db;
//use think\Config;
use Payment\Config;
use Payment\Client\Notify;
use Payment\Common\PayException;
use Payment\Notify\PayNotifyInterface;
use Payment\Client\Charge;
/**
* 支付宝支付回调
*/
class NotifyAli implements PayNotifyInterface{
public function notifyProcess(array $data)
{
// 执行业务逻辑,成功后返回true
$model = new NotifyAlipay();
$res = $model->package_notify($data);
if($res){
return true;
}
}
}
class NotifyAlipay extends Api{
protected $noNeedLogin = '*';
protected $noNeedRight = '*';
public function notify() {
// file_put_contents("ali_notify1.txt",json_encode($_REQUEST));
$callback = new NotifyAli();
$type = 'ali_charge';// ali_charge wx_charge cmb_charge
$aliConfig = [
'use_sandbox' => false, // 是否使用沙盒模式
'app_id' => '20975',
'sign_type' => 'RSA2', // RSA RSA2
// !!!注意:如果是文件方式,文件中只保留字符串,不要留下 -----BEGIN PUBLIC KEY----- 这种标记
// 可以填写文件路径,或者密钥字符串 当前字符串是 rsa2 的支付宝公钥(开放平台获取)
'ali_public_key' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIQAB',
// 可以填写文件路径,或者密钥字符串 我的沙箱模式,rsa与rsa2的私钥相同,为了方便测试
'rsa_private_key' => 'MIIEowIBAAKCAQEAtVIHx2pADLC3ItDQFxqeHQmvPjtDJwOkSTKcBNrGmS6okONqQE+RIawok5Wnsy1bNj9ETysL5yaQfHulnM+CkhYnZ/wLzihpmWL0SfMHd89rfVobZJsJmfAO',
'limit_pay' => [
], // 用户不可用指定渠道支付当有多个渠道时用“,”分隔
// 与业务相关参数
'notify_url' => 'https://an/NotifyAlipay/notify',
'return_url' => 'http://fcn/statics/ali.php',
'return_raw' => true, // 在处理回调时,是否直接返回原始数据,默认为 true
];
try {
// 获取第三方的原始数据,未进行签名检查,根据自己需要决定是否需要该步骤
//$retData = Notify::getNotifyData($type, $config);
$ret = Notify::run($type, $aliConfig , $callback);// 处理回调,内部进行了签名检查
} catch (PayException $e) {
echo $e->errorMessage();
exit;
}
return $ret;
}
/**
* 支付回调:
*/
public function package_notify($data) {
if($data['out_trade_no'] ){
//业务代码
$w["a.order_sn"] = array("eq",$data['out_trade_no']);
$order_info = Db::name('app_package_order a')
->field('a.*,b.info,b.dynamic_rate,b.block_days')
->join('app_package b', 'a.package_id = b.id', 'left')
->where($w)
->find();
if($order_info['pay_status']==1){
//已支付
return false;die;
}
return true;
}
}
}