支付宝扫码枪收银的实现原理你了解吗?

前几天弄完微信的条形码支付,很多条友私信说想知道支付宝的原理,那么今天小艾带着一上午搞定的成果出现啦废话不多说直接上效果!!!

  1. 商家通过扫描线下买家支付宝钱包中的条码、二维码等方式完成支付(本文讲讲这个);

  2. 线下买家通过使用支付宝钱包扫一扫,扫描商家的二维码等方式完成支付。

开发之前需要申请的开发参数详见支付宝开发平台进行申请

开发步骤:

步骤一、 下载官方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到程序的乐趣?

如果你有更好的封装效果欢迎留言!!!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值