基于tp5的支付宝app支付及回调

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42555539/article/details/88843865

1.支付宝开放平台添加应用,获得appid,并签约。
2.配置支付宝的应用公钥。
3.在开放平台下载官方sdk demo。
支付宝开放平台服务端php版SDK下载
4.生成订单信息,调用AlipayTradeAppPayRequest
(1)订单信息生成$order

$alipay = new model\Alipay();
$ali_pay_info = $alipay->ali_trade_pay($order);

(2)生成支付信息

public function ali_trade_pay($order)
{
		import('.Alipay.aop.AopClient', '', '.php');
        import('.Alipay.aop.request.AlipayTradeAppPayRequest', '', '.php');

        $aop = new \AopClient();
		$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
		$aop->appId = "商户号";
		$aop->rsaPrivateKey = '*****************************';//商户私钥,去头去尾去回车,一行字符串
		$aop->format = "json";
		$aop->charset = "UTF-8";
		$aop->signType = "RSA2";
		$aop->alipayrsaPublicKey = '*******************************';//支付宝公钥,去头去尾去回车,一行字符串
		
        $request = new \AlipayTradeAppPayRequest();
		$bizcontent = "{\"body\":\"".$order['order_sn']."\"," 
                . "\"subject\": \"".$order['order_sn']."\","
                . "\"out_trade_no\": \"". $order['out_trade_no']."\","//商户订单号
                . "\"timeout_express\": \"30m\"," 
                . "\"total_amount\": \"".$order['order_amount']."\","//支付金额
                . "\"product_code\":\"QUICK_MSECURITY_PAY\""
                . "}";
		
        $request->setNotifyUrl(APP_URL.'cen/Callback/aliNotify/');//回调地址
        $request->setBizContent($bizcontent);
		
        $response = $aop->sdkExecute($request);
		//htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
		//$response = htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。
        return $response;
}

这时候生成的支付信息就可以返回给ios/android端了
正确的信息大概是这样(客户端根据状态码和信息取pay_info,唤起app进行支付)

{
    "code": 200,
    "msg": "待支付",
    "data": {
        "order_id": 1432,
        "pay_info": "alipay_sdk=alipay-sdk-php-20180705&app_id=xxxxxxxxxxxxxxxx&biz_content=%7B%22body%22%3A%x'x'x'x'x'x'x'x'x'x'x'x'x%22%2C%22subject%22%3A+%x'x'x'x'x'x%22%2C%22out_trade_no%22%3Ax'x'x'x'x22timeout_express%22%3A+%x'x'x'x'x'x'x%22%2C%22total_amount%22%3A+%x'x'x'x'x'x'x%22%2C%22product_codeSbjkTLj4nr8x'x'x'x'x'xaVQC9%2BIzB32BRBu1OTcxwxRRfJSSbygjAO7nwL95Mn0YnTHA7T8XNj7KCKnNTRN98atuuXCHnhvgUwtfk1KG0hBZlr5x'x'x'x'xpYDsL7x'x'x'x'x'x4a%2ByjmvsWTkDOrhm26Sa5PPdtNYPveOOnLT0mLVbhHuzBhLCxQpz2sJVSpJs8J%2FJvCjc7Q4OWw%2FedblFS2lVl28vl2rYx'x'x'x'x'xLPM2KJAHaV6HTuAMB6ItLUeaJYcG3sTx'x'x'x'x'x'xaqe8z7IMBEI3%2BJw%3D%3D"
    }
}

5.回调

//支付宝回调
public function aliNotify()
{
		import('.Alipay.aop.AopClient', '', '.php');
        import('.Alipay.aop.request.AlipayTradeAppPayRequest', '', '.php');
        $aop = new \AopClient();
		$aop->alipayrsaPublicKey = 'x'x'x'x'x'x'x';//支付宝公钥
		$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
        //验证通过
		if($flag == true && ‘验证条件’)
		{
			//根据返回的信息进行订单处理
			$flow = new model\Flow();
			$flow->order_paid($_POST['out_trade_no'],$_POST['trade_no']);
			echo "success";	//支付宝
		}
		else
		{
			echo "fail";	
		}
}

(1)商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
(2)判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
(3)校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);
(4)验证app_id是否为该商户本身。
上述1、2、3、4有任何一个验证不通过,则表明同步校验结果是无效的,只有全部验证通过后,才可以认定买家付款成功。

展开阅读全文

没有更多推荐了,返回首页