支付宝的一些配置信息,可以写在config,这边我为了方便就放在这里
public $partner_public_key = "";
public $alipay_public_key = "";
public $serverUrl ='http://publicexprod.d5336aqcn.alipay.net/chat/multimedia.do';
public $appid = "";
public $partner_private_key = '';
public $format = "json";
public $charset = "GBK";
private function pay($order){
//支付宝
vendor('Alipay');
vendor('Alipay.aop.AopClient');
vendor('Alipay.aop.request.AlipayTradeAppPayRequest');
$notify_url = $_SERVER['HTTP_HOST'].url("Alipay/notify_url");
$config = array(
'appid' =>$this->appid,//
'rsaPrivateKey' =>$this->partner_private_key,//开发者私钥私钥
'alipayrsaPublicKey'=>$this->alipay_public_key,//支付宝公钥
'charset'=>strtolower('utf-8'),//编码
'notify_url' =>$notify_url,//回调地址(支付宝支付成功后回调修改订单状态的地址)
'payment_type' =>1,//(固定值)
'seller_id' =>'xxxxxxxx@163.com',//收款商家账号
'charset' => 'utf-8',//编码
'sign_type' => 'RSA2',//签名方式
'timestamp' =>date("Y-m-d H:i:s"),
'version' =>"1.0",//固定值
'url' => 'https://openapi.alipay.com/gateway.do',//固定值
'method' => 'alipay.trade.app.pay',//固定值
);
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
$aop->appId = $config['appid'];
$aop->rsaPrivateKey = $config['rsaPrivateKey'];
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey=$config['alipayrsaPublicKey'];
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
$request = new \AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数
$total_price = sprintf("%.2f",$order['total_price']);
$bizcontent = json_encode([
'body'=>'商城购物',
'subject'=>"商城购物",
'out_trade_no'=> $order['order_sn'],//此订单号为商户唯一订单号
'total_amount'=>$total_price,//保留两位小数
'product_code'=>'QUICK_MSECURITY_PAY'
]);
$request->setNotifyUrl($config['notify_url']);
$request->setBizContent($bizcontent);
//这里和普通的接口调用不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
$datas=$response;//就是orderString 可以直接给客户端请求,无需再做处理。
return $datas;//把这些参数返回给前端
}
接下来做一下回调处理
public function notify_url() {
vendor('Alipay');
vendor('Alipay.aop.AopClient');
$aop = new \AopClient();
$config['alipayrsaPublicKey']=$this->alipay_public_key;//公钥
$aop->alipayrsaPublicKey = $config['alipayrsaPublicKey'];
//此处验签方式必须与下单时的签名方式一致
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
//验签通过后再实现业务逻辑,比如修改订单表中的支付状态。
/**
①验签通过后核实如下参数out_trade_no、total_amount、seller_id
②修改订单表
**/
$arr = input('post.');
// Db::name('test')->insert(['test'=>json_encode(input('post.')),'addtime'=>time()]);
if($flag && $arr['trade_status'] == 'TRADE_SUCCESS'){
$trade_no = input('post.trade_no'); //支付宝交易号
$out_trade_no = input('post.out_trade_no'); //商户订单号
$order_info = Db::name("order")->where(['order_sn'=>$out_trade_no])->find();
if ($order_info['status'] == 5) {
echo "success";
}else{
/*以下写业务逻辑*/
}
echo "success";
}
}
配合前端做App开发,亲测可用!不足之处,欢迎指点!转载请注明来源