支付宝开发-条码支付

来源:互联网 发布:网络贷款理财平台 编辑:程序博客网 时间:2024/04/20 03:11

支付宝开发-关于条码支付

最近项目需要用到支付宝支付。大致流程就是收银台通过扫码设备扫描用户出示的付款码。进行付款。快捷方便。用php编写请求代码。c++(也就是收银台)那边调用我写的接口。进行付款。

首先还是看看开发文档吧 。传送门:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.u3cxFZ&treeId=193&articleId=105072&docType=1

具体流程图如下:

具体流程如下:

第一步:首先要去支付宝开发者平台创建应用

1.点击创建应用,下面两个是我已经创建过了应用

这里写图片描述

2.设置应用参数

这里面应用网关和回调地址我都设置服务器地址了。

这里写图片描述

这里的rsa密钥很关键,我是通过openssl工具生成,我建议大家也用这个生成。这个工具在官方文档上可以下载。
这里我给个配置rsa密钥连接,里面详细介绍了如果获得rsa密钥,
传送门:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.XZAA3d&treeId=200&articleId=105310&docType=1

如果还有其他问题,再联系我。

以上设置过了。就可以上线应用了,一般半天就好 了。

第二步,下载官方demo,阅读代码

下面拿我的php代码解释:
首先要在config.php文件中配置appid,商户密钥 支付宝密钥什么的。

<?php$config = array(    //支付宝公钥    'alipay_public_key' => "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB",    //商户私钥    'merchant_private_key' =>        "MIICXAIBAAKBgQDvLN/xcR8Nu+3/3K8IHaYK/LrFS3JPwM38oN95RaqAwSMJ6XH9vR2JB5w9MM+Et3gdZ/iVWROALQV5TSZIsVRA56u4jhnucuTC8YqNejySpxSI/N8rqffGqmfvtO+wDU3pcLrGiJN9FcPuUNVwYvdLuli0N6DAh2S5Vtvna2ovoQIDAQABAoGAT7vODFeB2rpD5YBUeYgoypDmUs+MFDpacVXQKkWnSbUZUTyZ29Un+36l/2A+Tig7ytHWdTN05M4dfQrTMHitdTC874vrbFHaDUT5vF7uPeA+wLDthM5lI1yrMT+L9sNYwDDTQYoRyBDhQ7miYd/Up3TGyinMQ0whBQkRuX1HAWECQQD92rQfgvY4qV0uFyPJAULObw8xk9G3dKYKl8TXKdi0q1F0Obu1GO6XiXqxHmXI1RsZ7rxqIPcbEBwsESrq8W6nAkEA8TJoiOU9EEGYNMra67GluoCII830qe+P9unIUKKdhIKuXxOfJt38+sqRThdFEarefrBIyTSkfE8p2CEKIQpAdwJBAL4S9tGtbo0oiyOKofnMXuhREfBOPTX/OqAt2W494AwPRtMes2S7AVMn1l0uZIoGvt8g+aUBf+ScoGuCgz8dfXsCQDVagjcuBljvOZ0L9mtGq7NatUK+T027+WuUAUSdBB0Iz0umyoDNgCV147iTeyrSUk9R7XfcljoNRONTQ6tVWjcCQC7ZddZzf12IgFFgHMF+5TStuGhLBVBVttvCBFGj1Jk9QPi7IOuzBrxSdmG530eMTnjBaJAAolGfLb6XrHrhdlI=",    //编码格式    'charset' => "UTF-8",    //支付宝网关    'gatewayUrl' => "https://openapi.alipay.com/gateway.do",    //应用ID    'app_id' => "2016120904050389",    //异步通知地址,只有扫码支付预下单可用    'notify_url' => "http://www.baidu.com",    //最大查询重试次数    'MaxQueryRetry' => "10",    //查询间隔    'QueryDuration' => "3");

支付宝公钥和商户私钥在你的应用信息里面都有,appid也在你的应用中。

支付接口请求接口:https://openapi.alipay.com/gateway.do

请求参数

  1. out_trade_no //订单编号
  2. auth_code //付款码
  3. subject //订单名称

这3个参数必填。其他参数可以在官方文档详细介绍。

if (!empty($_POST['out_trade_no'])&& trim($_POST['out_trade_no'])!="") {    // (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,    // 需保证商户系统端不能重复,建议通过数据库sequence生成,    $outTradeNo = "2016120904050389" . date('Ymdhis') . mt_rand(100, 1000);//    $outTradeNo = $_POST['out_trade_no'];    // (必填) 订单标题,粗略描述用户的支付目的。如“XX品牌XXX门店消费”    $subject = $_POST['subject'];    // (必填) 订单总金额,单位为元,不能超过1亿元    // 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】    $totalAmount = $_POST['total_amount'];    // (必填) 付款条码,用户支付宝钱包手机app点击“付款”产生的付款条码    $authCode = $_POST['auth_code']; //28开头18位数字    // 继续创建并添加第一条商品信息,用户购买的产品为“xx牙刷”,单价为5.05元,购买了两件    $goods2 = new GoodsDetail();    $goods2->setGoodsId("good_id002");    $goods2->setGoodsName("XXX商品2");// 当面付2.0条码支付(带轮询逻辑)    public function barPay($req) {        $outTradeNo = $req->getOutTradeNo();        $bizContent = $req->getBizContent();        $appAuthToken = $req->getAppAuthToken();        $this->writeLog($bizContent);        echo $bizContent;        $request = new AlipayTradePayRequest();        $request->setBizContent ( $bizContent );        $response = $this->aopclientRequestExecute ( $request , NULL , $appAuthToken);        //获取alipay_trade_pay_response对象数据,方便后续处理        $response = $response->alipay_trade_pay_response;        $result = new AlipayF2FPayResult($response);        if (!empty($response)&&("10000" == $response->code)) {            // 支付交易明确成功            $result->setTradeStatus("SUCCESS");        } elseif (!empty($response)&&("10003" == $response->code)) {            // 返回用户处理中,则轮询查询交易是否成功,如果查询超时,则调用撤销            $queryContentBuilder = new AlipayTradeQueryContentBuilder();            $queryContentBuilder->setOutTradeNo($outTradeNo);            $queryContentBuilder->setAppAuthToken($appAuthToken);            $loopQueryResponse = $this->loopQueryResult($queryContentBuilder);            return $this->checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $loopQueryResponse);        } elseif ($this->tradeError($response)) {            // 系统错误或者网络异常未响应,则查询一次交易,如果交易没有支付成功,则调用撤销            $queryContentBuilder = new AlipayTradeQueryContentBuilder();            $queryContentBuilder->setOutTradeNo($outTradeNo);            $queryContentBuilder->setAppAuthToken($appAuthToken);            $queryResponse = $this->query($queryContentBuilder);            return $this->checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $queryResponse);        } else {            // 其他情况表明该订单支付明确失败            $result->setTradeStatus("FAILED");        }        return $result;    }// 当面付2.0条码支付(带轮询逻辑)    public function barPay($req) {        $outTradeNo = $req->getOutTradeNo();        $bizContent = $req->getBizContent();        $appAuthToken = $req->getAppAuthToken();        $this->writeLog($bizContent);        echo $bizContent;        $request = new AlipayTradePayRequest();        $request->setBizContent ( $bizContent );        $response = $this->aopclientRequestExecute ( $request , NULL , $appAuthToken);        //获取alipay_trade_pay_response对象数据,方便后续处理        $response = $response->alipay_trade_pay_response;        $result = new AlipayF2FPayResult($response);        if (!empty($response)&&("10000" == $response->code)) {            // 支付交易明确成功            $result->setTradeStatus("SUCCESS");        } elseif (!empty($response)&&("10003" == $response->code)) {            // 返回用户处理中,则轮询查询交易是否成功,如果查询超时,则调用撤销            $queryContentBuilder = new AlipayTradeQueryContentBuilder();            $queryContentBuilder->setOutTradeNo($outTradeNo);            $queryContentBuilder->setAppAuthToken($appAuthToken);            $loopQueryResponse = $this->loopQueryResult($queryContentBuilder);            return $this->checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $loopQueryResponse);        } elseif ($this->tradeError($response)) {            // 系统错误或者网络异常未响应,则查询一次交易,如果交易没有支付成功,则调用撤销            $queryContentBuilder = new AlipayTradeQueryContentBuilder();            $queryContentBuilder->setOutTradeNo($outTradeNo);            $queryContentBuilder->setAppAuthToken($appAuthToken);            $queryResponse = $this->query($queryContentBuilder);            return $this->checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $queryResponse);        } else {            // 其他情况表明该订单支付明确失败            $result->setTradeStatus("FAILED");        }        return $result;    }

barpay方法中调用aopclientRequestExecute方法请求支付接口,根据返回的参数来判断支付成功

这里写图片描述

如果返回10003的情况下,证明用户正在付款,它会查询10次订单状态,每次睡眠5秒。如果10次之后用户依旧没有付款的情况下,那它就调用撤销订单接口。避免用户继续支付。

我这边只介绍一些重点。如果想进行开发的话,建议一定要通读源码。理解其意。

以上!

0 0
原创粉丝点击