前几天弄完微信的条形码支付,很多条友私信说想知道支付宝的原理,那么今天小艾带着一上午搞定的成果出现啦废话不多说直接上效果!!!
-
商家通过扫描线下买家支付宝钱包中的条码、二维码等方式完成支付(本文讲讲这个);
-
线下买家通过使用支付宝钱包扫一扫,扫描商家的二维码等方式完成支付。
开发之前需要申请的开发参数详见支付宝开发平台进行申请
开发步骤:
步骤一、 下载官方demo 地址:https://opendocs.alipay.com/open/54/104506;放置项目框架(tp5)的vendor文件中
步骤二、配置自己开发申请的必要参数:
<?php
/**
* 扫码支付
* 提醒:提交支付请求后微信会同步返回支付结果(没有异步回调通知)。当返回结果为“系统错误”时,商户系统等待5秒后调用【查询订单API】,查询支付实际交易结果;当返回结果为“USERPAYING”时,商户系统可设置间隔时间(建议10秒)重新查询支付结果,直到支付成功或超时(建议30秒);
*/
namespace app\api\controller;
use think\Controller;
use think\Db;
use think\Input;
use think\facade\Request;
use app\api\controller\Common;
header("Access-Control-Allow-Origin:*");
header("Content-type: text/html; charset=utf-8");
require_once $_SERVER['DOCUMENT_ROOT'].'/vendor/Alipaydangmianfu_demo/f2fpay/model/builder/AlipayTradePayContentBuilder.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/vendor/Alipaydangmianfu_demo/f2fpay/service/AlipayTradeService.php';
/**
* 支付宝当面付
* @package app\api\controller
*/
class Alipay{
/**
* Notes:
* User: 小艾
* Time:下午 1:51
*$authCode 用户支付码
*$totalAmount 支付金额
*$outTradeNo 订单号
* DATE:2020/12/10 0010
*/
public function alipay($authCode,$totalAmount,$outTradeNo){
$common = new Common();
$config = array (
//签名方式
'sign_type' => "RSA2",
//支付宝公钥
'alipay_public_key'=>'',
//商户私钥
'merchant_private_key' => "",
//编码格式
'charset' => "UTF-8",
//支付宝网关
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
//应用ID
'app_id' => "2016111102724113",
//异步通知地址,只有扫码支付预下单可用
'notify_url' => "",
//最大查询重试次数
'MaxQueryRetry' => "10",
//查询间隔
'QueryDuration' => "3"
);
// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
// 需保证商户系统端不能重复,建议通过数据库sequence生成,
// $outTradeNo = "Dsx" . date('Ymdhis') . mt_rand(100, 1000);
$subject = "第三巷条形码支付";
// $totalAmount = $_POST['payAmount']; // (必填) 订单总金额,单位为元,不能超过1亿元
// (必填) 付款条码,用户支付宝钱包手机app点击“付款”产生的付款条码
// $authCode = $_POST['auth_code']; //28开头18位数字
// 支付超时,线下扫码交易定义为5分钟
$timeExpress = "5m";
// 创建请求builder,设置请求参数
$barPayRequestBuilder = new \AlipayTradePayContentBuilder();
$barPayRequestBuilder->setOutTradeNo($outTradeNo);
$barPayRequestBuilder->setTotalAmount($totalAmount);
$barPayRequestBuilder->setAuthCode($authCode);
$barPayRequestBuilder->setTimeExpress($timeExpress);
$barPayRequestBuilder->setSubject($subject);
// 调用barPay方法获取当面付应答
$barPay = new \AlipayTradeService($config);
$barPayResult = $barPay->barPay($barPayRequestBuilder);
switch ($barPayResult->getTradeStatus()) {
case "SUCCESS":
// echo "支付宝支付成功:" . "<br>--------------------------<br>";
$data = $barPayResult->getResponse();
$result = $common->returnway(2000,"支付宝支付成功!",$data);
return json_encode($result);
break;
case "FAILED":
// echo "支付宝支付失败!!!" . "<br>--------------------------<br>";
if (!empty($barPayResult->getResponse())) {
$data = $barPayResult->getResponse();
$result = $common->returnway(2002,"支付宝支付失败!",$data);
return json_encode($result);
}
break;
case "UNKNOWN":
// echo "系统异常,订单状态未知!!!" . "<br>--------------------------<br>";
if (!empty($barPayResult->getResponse())) {
$result = $common->returnway(4000,"系统异常,订单状态未知!",$barPayResult->getResponse());
return json_encode($result);
}
break;
default:
echo "不支持的交易状态,交易返回异常!!!";
break;
}
return;
}
}
步骤三、接收前端参数 调取下列方法即可
/**
* Notes:门店扫码支付
* User: 小艾
* Time:下午 4:14
* DATE:2020/12/9 0009
*/
public function Scantopay(){
header("Access-Control-Allow-Origin:*");
$common = new Common();
if (request()->isPost()){
$authCode = input('authCode','');//用户付款码
$payAmount = input('payAmount','');//订单支付金额
$outTradeNo = input('outTradeNo','');//订单号$out_trade_no
$payment_type = input('payment_type',1);//支付方式 1-微信 2-支付宝 3-现金支付
if (!empty($authCode) && !empty($payAmount) && !empty($outTradeNo)){
if($payment_type == 1){//调取微信扫码支付
$weixinpay = new Scantopay();
$data = $weixinpay->weixinpay($authCode,$payAmount,$outTradeNo);
if($data['return_code']=='SUCCESS'){//订单支付成功扣除门店库存
$result = $common->returnway(2000,'支付成功!',$data);
return json_encode($result);
}else{
$result = $common->returnway(4001,'支付支付!',$data);
return json_encode($result);
}
}elseif ($payment_type == 2){//调取支付宝扫码支付
$alipay = new Alipay();
$data = $alipay->alipay($authCode,$payAmount,$outTradeNo);
print_r($data);die;
// if($data['return_code']=='SUCCESS'){
// $result = $common->returnway(2000,'支付成功!',$data);
// return json_encode($result);
// }
}
}else{
$result = $common->returnway(4001,'请求参数不能为空!',[]);
return json_encode($result);
}
}else{
$result = $common->returnway(4000,'请求方式有误!',[]);
return json_encode($result);
}
}
和微信的原理效果一样,所以我封装到一起了,阅读到这里的好友们有没有get到程序的乐趣?
如果你有更好的封装效果欢迎留言!!!