当前位置:首页 » 编程语言 » php支付宝支付sdk

php支付宝支付sdk

发布时间: 2022-09-11 18:24:34

A. php 5.3.13怎么使用支付宝RSA2

  1. 配置开发者信息“私钥”And“App_id”

/*配置信息*/
//支付宝分配给开发者的应用ID
$app_id='';
//开发者私钥,为这里填入方便,去头、去尾、去换行字符串私钥,私钥处理放在签名方法内。
$private_key='';
//商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
$sign_type='RSA2';
/*配置信息*/

2.组装部分请求参数:根据接口文档组装参数app_id、method、format、timestamp、charset、version、notify_url、sign_type

/*组装请求参数部分start*/

//支付宝分配给开发者的应用ID
$params['app_id']=$app_id;
//接口名称
$params['method']='alipay.trade.app.pay';
//仅支持JSON
$params['format']='json';
//发送请求的时间,格式"yyyy-MM-ddHH:mm:ss"
$params['timestamp']=date("Y-m-dH:i:s");
//请求使用的编码格式,如utf-8,gbk,gb2312等
$params['charset']='UTF-8';
//调用的接口版本,固定为:1.0
$params['version']='1.0';
//支付宝服务器主动通知商户服务器里指定的页面http/https路径。建议商户使用https
$params['notify_url']='';
//商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
$params['sign_type']=$sign_type;

/*组装请求参数部分end*/

3.组装业务参数json格式,并填充在$params数组中

/*组装业务参数json*/
//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
$bizcontent['body']='非sdk原生php服务端生成请求订单';
//商品的标题/交易标题/订单标题/订单关键字等。
$bizcontent['subject']='php代码示例';

/*生成随机数作为外部订单号start*/
$date=date("YmdHis");
$arr=range(1000,9999);
shuffle($arr);
$out_trade_no=$date.$arr[0];
/*生成随机数作为外部订单号end*/
//商户网站唯一订单号
$bizcontent['out_trade_no']=$out_trade_no;
//设置未付款支付宝交易的超时时间,一旦超时,该笔交易就会自动被关闭。当用户进入支付宝收银台页面(不包括登录页面),会触发即刻创建支付宝交易,此时开始计时。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。该参数数值不接受小数点,如1.5h,可转换为90m。
$bizcontent['timeout_express']='10m';
//订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
$bizcontent['total_amount']='0.01';
//销售产品码,商家和支付宝签约的产品码
$bizcontent['proct_code']='QUICK_MSECURITY_PAY';
//商品主类型:0—虚拟类商品,1—实物类商品注:虚拟类商品不支持使用花呗渠道
$bizcontent['goods_type']='0';
//公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数。支付宝会在异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝
$bizcontent['passback_params']='spicy%3d%e8%87%aa%e5%ae%9a%e4%b9%89%e5%8f%82%e6%95%b01%26custom%3d%e8%87%aa%e5%ae%9a%e4%b9%89%e5%8f%82%e6%95%b02';

$biz_content=json_encode($bizcontent,JSON_UNESCAPED_UNICODE);
/*组装业务参数json*/

//将业务参数填充在请求参数内
$params['biz_content']=$biz_content;

4.排序签名得到sign,并填充在$params数组中“签名方法请往下翻”

//排序
ksort($params);
//调用签名方法得到sign填入请求参数
$params['sign']=sign($params,$params['sign_type'],$private_key);

5.将参数urlencode输出查看,打印出来的参数可以直接放在客户端使用

//htmlspecialchars是为防止浏览器将参数中的“×”和“¬”转义
echohtmlspecialchars(http_build_query($params));

工具方法:签名方法和检查是否为空方法

/**
*签名函数
*
*@paramarray$params请求参数数组
*@paramstring$signType签名方式
*@paramstring$private_key为了方便只要填一行字符串
*@returnstring返回类型
*/
functionsign($params,$signType,$private_key){
$stringToBeSigned="";
$i=0;
//将数组使用&符号拼接
foreach($paramsas$k=>$v){
if(false===checkEmpty($v)&&"@"!=substr($v,0,1)){
if($i==0){
$stringToBeSigned.="$k"."="."$v";
}else{
$stringToBeSigned.="&"."$k"."="."$v";
}
$i++;
}
}
unset($k,$v);

//私钥处理
$res="-----BEGINRSAPRIVATEKEY-----".PHP_EOL.wordwrap($private_key,64,PHP_EOL,true).PHP_EOL."-----ENDRSAPRIVATEKEY-----";
($res)ordie('您使用的私钥格式错误,请检查RSA私钥配置');

//
if("RSA2"==$signType){
openssl_sign($stringToBeSigned,$sign,$res,OPENSSL_ALGO_SHA256);
}else{
openssl_sign($stringToBeSigned,$sign,$res);
}
returnbase64_encode($sign);
}

/**
*检查是否为空
*
*@paramstring$value请求参数数组
*@returnbool返回类型
*/
functioncheckEmpty($value){
if(!isset($value))
returntrue;
if($value===null)
returntrue;
if(trim($value)==="")
returntrue;
returnfalse;
}

B. php开发中app怎么接入支付宝

准备工作
APP支付接口:alipay.trade.app.pay
服务器端使用框架:TP5
登录蚂蚁金服开放平台 --> 创建应用 --> 添加App支付功能。具体查看官方文档
下载官方 SDK (PHP版本资源)——当前SDK版本:106 生成时间:2017-07-25 11:46:10
将SDK原码放置在TP5的vendor目录下的alipay文件夹(可根据实际使用框架技术进行实际调整)。
支付接口调用原理
1、APP支付系统架构
APP支付系统架构图
2、数据校验原理
数据校验原理
应用公钥(商户自身的RSA公钥):支付宝使用该公钥验证该交易是商户发起。
支付宝公钥(支付宝的RSA公钥):商户使用该公钥验证该结果是支付宝返回的。
3、系统交互流程
系统交互流程图
4、支付场景具体实现流程(最详细图解)
在集成App支付能力时,建议实现如下支付流程,创建订单并支付,根据返回的结果确定支付状态,并进行相应的异常处理,其过程如下图所示.
支付场景具体实现流程
商家APP在创建订单并且唤起支付宝APP支付,流程如上图所示,根据第2.2,3步返回的支付结果,确定支付状态,并且做相应的异常处理(必要时关闭订单)
代码实现
步骤1:商户APP端请求商户服务器接口,提交订单数据。
步骤2:商户服务器端接收数据,然后对数据进行签名,返回请求参数到商户APP端。
官方接口文档:https://docs.open.alipay.com/204/105465/
——代码如下:
//vendor();为TP5框架的方法,作用:导入第三方框架类库
vendor('alipay.aop.AopClient');
vendor('alipay.aop.request.AlipayTradeAppPayRequest');
//实例化支付接口
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; //支付宝网关
$aop->appId = “应用ID,填写你的APPID”;
$aop->rsaPrivateKey = "商户私钥,您的原始格式RSA私钥()";
$aop->alipayrsaPublicKey = "支付宝公钥";
$aop->apiVersion = '1.0';
$aop->signType = "签名方式,如 RSA2 ";
$aop->postCharset = 'UTF-8';
$aop->format = "json";
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
$appRequest = new \AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数
$bizcontent = json_encode([
'body' => '余额充值', //订单描述
'subject' => '充值', //订单标题
'timeout_express' => '30m',
'out_trade_no' => ‘20170125test01’, //商户网站唯一订单号
'total_amount' => '0.01', //订单总金额
'proct_code' => 'QUICK_MSECURITY_PAY', //固定值
]);
$appRequest->setNotifyUrl($url); //设置异步通知地址
$appRequest->setBizContent($bizcontent);
//这里和普通的接口调用不同,使用的是sdkExecute
$response = $aop->sdkExecute($appRequest);
//htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
echo htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。
// 如果最后有问题可以尝试把htmlspecialchars方法去掉,直接返回$response
说明:sdkExecute()方法,作用生成签名,详细步骤如下:
将请求参数组装分下列3步,以最后第三步获取到的请求为准。
1)将请求参数的键按字典排序,然后按照key=value&key=value方式拼接,得到未签名原始字符串如下:
app_id=2015052600090779&biz_content={"timeout_express":"30m","proct_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2×tamp=2016-08-25 20:26:31&version=1.0
2)再对原始字符串进行签名
app_id=2015052600090779&biz_content={"timeout_express":"30m","proct_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2×tamp=2016-08-25 20:26:31&version=1.0&sign=+/=
3)最后对请求字符串的所有一级value(biz_content作为一个value)进行encode,编码格式按请求串中的charset为准,没传charset按UTF-8处理,获得最终的请求字符串:
app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22proct_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA2×tamp=2016-08-25%2020%3A26%3A31&version=1.0&sign=%2B%2F%3D
步骤3:商户APP接收从商户服务器端返回的请求参数,然后调起支付宝支付面板。
若用户支付成功,支付宝会同步给商户APP端返回一个支付结果。相应地,支付宝也会通过异步通知给商户服务器端返回一个支付结果。
注意:由于同步通知和异步通知都可以作为支付完成的凭证,且异步通知支付宝一定会确保发送给商户服务端。为了简化集成流程,商户可以将同步结果仅仅作为一个支付结束的通知(忽略执行校验),实际支付是否成功,完全依赖服务端异步通知。
步骤4:服务端异步通知处理机制(支付宝主动发起通知,该方式才会被启用)
官方接口文档:https://docs.open.alipay.com/204/105301/
注意点:
1)必须保证服务器异步通知页面(notify_url)上无任何字符,如空格、HTML标签、开发系统自带抛出的异常提示信息等;
2)支付宝是用POST方式发送通知信息,因此该页面中获取参数的方式,如:$_POST[‘out_trade_no’];
3)程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);
4)当商户收到服务器异步通知并打印出success时,服务器异步通知参数notify_id才会失效。
——代码如下:
$aop = new AopClient;
$aop->alipayrsaPublicKey = '请填写支付宝公钥,一行字符串';
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2"); //验证签名
if($flag){
//校验通知数据的正确性
$out_trade_no = $_POST[‘out_trade_no']; //商户订单号
$trade_no = $_POST[‘trade_no']; //支付宝交易号
$trade_status = $_POST[‘trade_status']; //交易状态trade_status
$total_amount = $_POST[‘'total_amount']; //订单的实际金额
$app_id = $_POST[‘app_id'];
if($app_id!=$this->config['app_id']) exit('fail'); //验证app_id是否为该商户本身
//只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。
if($trade_status != 'TRADE_FINISHED' && $trade_status != 'TRADE_SUCCESS')
exit('fail');
//校验订单的正确性
if(!empty($out_trade_no)){
//1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
//2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
//3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)。
//上述1、2、3有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。
//校验成功后在response中返回success,校验失败返回failure
}
exit('fail');
}
echo"fail"; //验证签名失败
步骤5:当商户APP端接收到支付宝的同步返回结果为成功时,商户APP端再请求商户服务器端API,判断订单最终支付结果,并做出最终响应。

C. 支付宝SDK怎么用

可以先去下载一个的有源码DEMO。
现在的SDK改名叫移动支付集成开发包。
步骤方法:
1、调用支付宝支付接口

2、处理支付宝返回的支付结果
在调用支付宝支付接口前,还需要先生成一个订单,文档中描述时,是将这步也放在客户端来做了,但也可以在服务器端生成这个订单(图中支付宝会在支付成功后通知服务器端,所以在服务器端生成订单的话,可以掌握所有订单,而且也会更安全):
生成订单(可以在iOS客户端内生成,也可以在服务器端生成)。
3、调用支付宝支付接口,发送订单
4、处理支付宝返回的支付结果
其实对于业务来说,这些步骤已经够了,但是有一个安全性问题,不希望接收到的支付结果被截获修改,所以,这就需要在生成订单和处理支付结果的时候做一个安全性校验:
生成订单时对数据签名,收到支付结果时对数据进行签名验证,以检验数据是否被篡改过。
5、采用RSA加密方式做签名验证。

D. PHP怎么做银联的支付接口调用

PHP做银联支付接口调用问题
//在工商支付接口之前要找到工行提供的接口文件级dll文件
//将订单签名数据公钥加密提供给工行指定页面
//组织要签名的数据串
$src="ICBC_PERBANK_B2C1.0.0.0".$infomer["merid"].$infomer["meracct"].$returnaddress."HS".$ddnumber.$amount."0010".$nowtime."0";
$com=new com('ICBCEBANKUTIL.B2CUtil');
$rc=$com->init("c:\WINDOWS\user.crt","c:\WINDOWS\user.crt","c:\WINDOWS\user.key","11111111");
$ssrc=$com->signC($src, strlen($src)); //订单签名数据
$rc=$com->verifySignC($src,strlen($src), $ssrc, strlen($ssrc));
$cert=$com->getCert(1); //商城证书公钥
//将商户证书存储到c:\WINDOWS目录下,然后创建form表单,将指定的数据提交到工行指定的网页中
<!--支付宝支付的接口操作,提交的数据-->
<td width="100"><a href="<{$link}>"><img src="images/sy_19.gif" width="90" height="25" border="0"></a></td>
<!--——————————————————-->
<!--工行支付的接口操作,提交的数据-->
<form action="https://mybank.icbc.com.cn/" method="post" name="form_bank">
<input name="interfaceName" type="hidden" value="ICBC_PERBANK_B2C"/>
<input name="interfaceVersion" type="hidden" value="1.0.0.0"/>
<input name="orderid" type="hidden" value="<{$ddnumber}>"/>
<input name="amount" type="hidden" value="<{$amount}>"/>
<input name="curType" type="hidden" value="001"/>
<input name="merID" type="hidden" value="<{$merid}>"/>
<input name="merAcct" type="hidden" value="<{$meracct}>"/>
<input name="verifyJoinFlag" type="hidden" value="0"/>
<input name="notifyType" type="hidden" value="HS"/>
<input name="merURL" type="hidden" value="<{$returnaddress}>"/>
<input name="resultType" type="hidden" value="0"/>
<input name="orderDate" type="hidden" value="<{$nowtime}>"/>
<input name="merSignMsg" type="hidden" value="<{$ssrc}>" />
<input name="merCert" type="hidden" value="<{$cert}>" />
</form>

E. php支付宝验签失败

1可能是编码问题,看所有文件是不是都使用了统一编码,比如utf8; 2检查申请的SDK是否输入正确,是否完整输入了申请的SDK; 3如果是支付宝帐号密码的问题,那就不说了 4建议启动服务器后稍等几分钟,再做验证。

F. php 支付宝接口官方给的md5签名版本和rsa签名版本的区别

虽然支付宝官方还未提供相关SDK,PHP确实可以实现RSA方式的签名,这点其实很重要,由于不熟悉,在遇到困难的时候,经常会不由自主地想到是否PHP不支持RSA签名,干脆用MD5得了,这样就没有了前进的动力。其实说穿了MD5和RSA签名,不同的只是签名方式的区别,其他的都一样,因此我这里主要说一下如何用RSA进行签名和验签。
首先你需要准备下面的东西:
php的openssl扩展里已经封装好了验签的方法openssl_verify。
如果在Windows下的php.ini需要开启Openssl模块: extension=php_openssl.dll
商户私钥:
即RSA私钥,按照手册,按以下方式生成:
openssl genrsa -out rsa_private_key.pem 1024
商户公钥:
即RSA私钥,按照手册,按以下方式生成:
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
生成之后,按照手册的说明,需要在签约平台上传公钥,需要注意的是,上传的时候需要把所有的注释和换行都去掉。
另外手册中还有如下命令:
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
该命令将RSA私钥转换成PKCS8格式,对于PHP来说,不需要。
支付宝公钥:
根据手册,在签约平台获得。
如果你直接复制下来的话,会得到一个字符串,需要进行下面的转换;
1)把空格变成换行
2)添加注释
比如你复制下来的公钥是:
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB,那转换之后为:
-----BEGIN PUBLIC KEY-----

ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB
-----END PUBLIC KEY-----
把公钥保存在文件里。
注意这个是2048位的公钥应该是9行或者10行,不能为1行,不然PHP的openssl_pkey_get_public无法读取,pub_key_id的结果为false,如果没有-----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY----- 可以自己加上,最后保存到一个rsa_public_key.pem文件中。
好了,现在已经有了所有的东西,先看签名函数:
复制代码
1 <?php
2 /**
3 * 签名字符串
4 * @param $prestr 需要签名的字符串
5 * return 签名结果
6 */
7 function rsaSign($prestr) {
8 $public_key= file_get_contents('rsa_private_key.pem');
9 $pkeyid = openssl_get_privatekey($public_key);
10 openssl_sign($prestr, $sign, $pkeyid);
11 openssl_free_key($pkeyid);
12 $sign = base64_encode($sign);
13 return $sign;
14 }
15 ?>
复制代码
注意点:
1.$prestr的内容和MD5一样(参见手册,但不包含最后的MD5密码)
2.签名用商户私钥
3.最后的签名,需要用base64编码
4.这个函数返回的值,就是这次请求的RSA签名。
验签函数:
复制代码
1 <?php
2 /**
3 * 验证签名
4 * @param $prestr 需要签名的字符串
5 * @param $sign 签名结果
6 * return 签名结果
7 */
8 function rsaVerify($prestr, $sign) {
9 $sign = base64_decode($sign);
10 $public_key= file_get_contents('rsa_public_key.pem');
11 $pkeyid = openssl_get_publickey($public_key);
12 if ($pkeyid) {
13 $verify = openssl_verify($prestr, $sign, $pkeyid);
14 openssl_free_key($pkeyid);
15 }
16 if($verify == 1){
17 return true;
18 }else{
19 return false;
20 }
21 }
22 ?>
复制代码
注意点:
1.$prestr的内容和MD5一样(参见手册)
2.$sign是支付宝接口返回的sign参数用base64_decode解码之后的二进制
3.验签用支付宝公钥
4.这个函数返回一个布尔值,直接告诉你,验签是否通过
支付宝官方提供的PHP版SDK demo中只对MD5加密方式进行了处理,但android 端和ios端 请求支付宝加密方式只能用RSA加密算法,这时服务端PHP就无法验证签名了,所以需要对demo进行一些修改。
1、修改alipay_notify.class.php文件
verifyNotify 函数第46行
$isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
改成
$isSign = $this->getSignVeryfy($_POST, $_POST["sign"], $_POST["sign_type"]);
verifyReturn 函数第83行
$isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);
改成
$isSign = $this->getSignVeryfy($_GET, $_GET["sign"], $_GET["sign_type"]);
getSignVeryfy 函数 116行
function getSignVeryfy($para_temp, $sign) {
改成
function getSignVeryfy($para_temp, $sign, $sign_type) {
getSignVeryfy 函数 127行
switch (strtoupper(trim($this->alipay_config['sign_type']))) {
case "MD5" :
$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
break;
default :
$isSgin = false;
}
改成
switch (strtoupper(trim($sign_type))) {
case "MD5" :
$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
break;
case "RSA" :
$isSgin = rsaVerify($prestr, $sign);
break;
default :
$isSgin = false;
}
2、新建一个alipay_rsa.function.php文件
复制代码
1 <?php
2 /* *
3 * RSA
4 * 详细:RSA加密
5 * 版本:3.3
6 * 日期:2014-02-20
7 * 说明:
8 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
9 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
10 */
11 /**
12 * 签名字符串
13 * @param $prestr 需要签名的字符串
14 * return 签名结果
15 */
16 function rsaSign($prestr) {
17 $public_key= file_get_contents('rsa_private_key.pem');
18 $pkeyid = openssl_get_privatekey($public_key);
19 openssl_sign($prestr, $sign, $pkeyid);
20 openssl_free_key($pkeyid);
21 $sign = base64_encode($sign);
22 return $sign;
23 }
24 /**
25 * 验证签名
26 * @param $prestr 需要签名的字符串
27 * @param $sign 签名结果
28 * return 签名结果
29 */
30 function rsaVerify($prestr, $sign) {
31 $sign = base64_decode($sign);
32 $public_key= file_get_contents('rsa_public_key.pem');
33 $pkeyid = openssl_get_publickey($public_key);
34 if ($pkeyid) {
35 $verify = openssl_verify($prestr, $sign, $pkeyid);
36 openssl_free_key($pkeyid);
37 }
38 if($verify == 1){
39 return true;
40 }else{
41 return false;
42 }
43 }
44 ?>

G. php开发,如果进行支付宝APP支付

你好,我这里建议你使用支付宝的老接口进行开发,新的接口比较复杂,不太适合新手你。

H. 各支付SDK流程

一、微信支付

微信支付官方流程链接: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3

简要来说流程如下:

1.用户点击商品下单:“商户客户端”调用“商户服务端”生成订单,“商户服务端”后台调用“微信支付系统”的“统一下单API”接口,生成预付订单后,返回给“商户服务端后台”,商户后台再回调给“商户客户端”。

2.用户确认支付:“商户客户端”调用“调起微信支付”接口,界面跳转到微信进行支付。

3.用户支付成功:这里有三个回调,其一、“微信支付系统”通知“商户管理后台”支付信息。其二、“微信支付系统”通知“微信客户端”支付结果。其三、“微信支付系统”通过“商户客户端”实现的回调中处理支付状态,“商户客户端”可通过调用“商户管理后台”的接口查询当前订单状态。(商户管理后台也需要调用“微信支付系统”查询订单接口)

二、支付宝支付

支付流程图:

支付宝支付对比微信支付流程还进行了简化,即在生成订单时,不需要商户后台请求支付宝生成订单,基本流程如下:

1.“商家APP”请求“商家后台”下单,“商家后台”返回订单信息。

2.“商家APP”根据订单唤起“支付宝App”进行支付。

3.支付成功后,“支付宝支付后台”返回支付结果给“支付宝App”,“支付宝App”返回支付结果给“商家App”、“支付宝支付后台”异步通知支付结果给“商家后台”。

三、苹果支付

流程图:

支付流程:

1.用户点击购买,“App客户端”请求“App服务端”创建交易订单。

2.“APP客户端”拿到交易信息,然后开始调起“IAP 服务器”创建订单。

3.“IAP服务器”通知购买成功,并把收据信息写入APP沙盒中。

4.“APP客户端”去沙盒中拿到收据信息,并将收据信息上传到“APP服务器”,“APP服务器”把收据信息请求“IAP 服务器”验证,如果有则返回到“APP客户端”,把订单结束。

参考链接: https://juejin.im/post/5a3b14f36fb9a045104aa6c8

I. 支付宝SDK怎么用

可以先去下载一个的有源码DEMO。
现在的SDK改名叫移动支付集成开发包。
步骤方法:
1、调用支付宝支付接口
2、处理支付宝返回的支付结果
在调用支付宝支付接口前,还需要先生成一个订单,文档中描述时,是将这步也放在客户端来做了,但也可以在服务器端生成这个订单(图中支付宝会在支付成功后通知服务器端,所以在服务器端生成订单的话,可以掌握所有订单,而且也会更安全):
生成订单(可以在iOS客户端内生成,也可以在服务器端生成)。
3、调用支付宝支付接口,发送订单
4、处理支付宝返回的支付结果
其实对于业务来说,这些步骤已经够了,但是有一个安全性问题,不希望接收到的支付结果被截获修改,所以,这就需要在生成订单和处理支付结果的时候做一个安全性校验:
生成订单时对数据签名,收到支付结果时对数据进行签名验证,以检验数据是否被篡改过。
5、采用RSA加密方式做签名验证。

J. thinkPHP框架的项目怎么做支付宝支付功能

1、在配置文件中Conf/Config.php文件中对支付宝相关参数进行配置:
//支付宝配置参数
'alipay_config'=>array(
'partner' =>'20********50', //这里是你在成功申请支付宝接口后获取到的PID;
'key'=>'9t***********ie',//这里是你在成功申请支付宝接口后获取到的Key
'sign_type'=>strtoupper('MD5'),
'input_charset'=> strtolower('utf-8'),
'cacert'=> getcwd().'\\cacert.pem',
'transport'=> 'http',
),
//以上配置项,是从接口包中alipay.config.php 文件中复制过来,进行配置;

'alipay' =>array(
//这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号
'seller_email'=>'[email protected]',

//这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;
'notify_url'=>'http://www.xxx.com/Pay/notifyurl',

//这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;
'return_url'=>'http://www.xxx.com/Pay/returnurl',

//支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)
'successpage'=>'User/myorder?ordtype=payed',

//支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)
'errorpage'=>'User/myorder?ordtype=unpay',
),
复制代码
2、新建一个PayAction控制器代码如下:
<?php
class PayAction extends Action{
//在类初始化方法中,引入相关类库
public function _initialize() {
vendor('Alipay.Corefunction');
vendor('Alipay.Md5function');
vendor('Alipay.Notify');
vendor('Alipay.Submit');
}

//doalipay方法
/*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
然后进行相关处理
*/
public function doalipay(){
/*********************************************************
把alipayapi.php中复制过来的如下两段代码去掉,
第一段是引入配置项,
第二段是引入submit.class.php这个类。
为什么要去掉??
第一,配置项的内容已经在项目的Config.php文件中进行了配置,我们只需用C函数进行调用即可;
第二,这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入;所以这里不再需要;
*****************************************************/
// require_once("alipay.config.php");
// require_once("lib/alipay_submit.class.php");

//这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
$alipay_config=C('alipay_config');

/**************************请求参数**************************/

$payment_type = "1"; //支付类型 //必填,不能修改
$notify_url = C('alipay.notify_url'); //服务器异步通知页面路径
$return_url = C('alipay.return_url'); //页面跳转同步通知页面路径
$seller_email = C('alipay.seller_email');//卖家支付宝帐户必填
$out_trade_no = $_POST['trade_no'];//商户订单号 通过支付页面的表单进行传递,注意要唯一!
$subject = $_POST['ordsubject']; //订单名称 //必填 通过支付页面的表单进行传递
$total_fee = $_POST['ordtotal_fee']; //付款金额 //必填 通过支付页面的表单进行传递
$body = $_POST['ordbody']; //订单描述 通过支付页面的表单进行传递
$show_url = $_POST['ordshow_url']; //商品展示地址 通过支付页面的表单进行传递
$anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
$exter_invoke_ip = get_client_ip(); //客户端的IP地址
/************************************************************/

//构造要请求的参数数组,无需改动
$parameter = array(
"service" => "create_direct_pay_by_user",
"partner" => trim($alipay_config['partner']),
"payment_type" => $payment_type,
"notify_url" => $notify_url,
"return_url" => $return_url,
"seller_email" => $seller_email,
"out_trade_no" => $out_trade_no,
"subject" => $subject,
"total_fee" => $total_fee,
"body" => $body,
"show_url" => $show_url,
"anti_phishing_key" => $anti_phishing_key,
"exter_invoke_ip" => $exter_invoke_ip,
"_input_charset" => trim(strtolower($alipay_config['input_charset']))
);
//建立请求
$alipaySubmit = new AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
echo $html_text;
}

/******************************
服务器异步通知页面方法
其实这里就是将notify_url.php文件中的代码复制过来进行处理

*******************************/
function notifyurl(){
/*
同理去掉以下两句代码;
*/
//require_once("alipay.config.php");
//require_once("lib/alipay_notify.class.php");

//这里还是通过C函数来读取配置项,赋值给$alipay_config
$alipay_config=C('alipay_config');

//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();

if($verify_result) {
//验证成功
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
$out_trade_no = $_POST['out_trade_no']; //商户订单号
$trade_no = $_POST['trade_no']; //支付宝交易号
$trade_status = $_POST['trade_status']; //交易状态
$total_fee = $_POST['total_fee']; //交易金额
$notify_id = $_POST['notify_id']; //通知校验ID。
$notify_time = $_POST['notify_time']; //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
$buyer_email = $_POST['buyer_email']; //买家支付宝帐号;
$parameter = array(
"out_trade_no" => $out_trade_no, //商户订单编号;
"trade_no" => $trade_no, //支付宝交易号;
"total_fee" => $total_fee, //交易金额;
"trade_status" => $trade_status, //交易状态
"notify_id" => $notify_id, //通知校验ID。
"notify_time" => $notify_time, //通知的发送时间。
"buyer_email" => $buyer_email, //买家支付宝帐号;
);
if($_POST['trade_status'] == 'TRADE_FINISHED') {
//
}else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { if(!checkorderstatus($out_trade_no)){
orderhandle($parameter);
//进行订单处理,并传送从支付宝返回的参数;
}
}
echo "success"; //请不要修改或删除
}else {
//验证失败
echo "fail";
}
}

/*
页面跳转处理方法;
这里其实就是将return_url.php这个文件中的代码复制过来,进行处理;
*/
function returnurl(){
//头部的处理跟上面两个方法一样,这里不罗嗦了!
$alipay_config=C('alipay_config');
$alipayNotify = new AlipayNotify($alipay_config);//计算得出通知验证结果
$verify_result = $alipayNotify->verifyReturn();
if($verify_result) {
//验证成功
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
$out_trade_no = $_GET['out_trade_no']; //商户订单号
$trade_no = $_GET['trade_no']; //支付宝交易号
$trade_status = $_GET['trade_status']; //交易状态
$total_fee = $_GET['total_fee']; //交易金额
$notify_id = $_GET['notify_id']; //通知校验ID。
$notify_time = $_GET['notify_time']; //通知的发送时间。
$buyer_email = $_GET['buyer_email']; //买家支付宝帐号;

$parameter = array(
"out_trade_no" => $out_trade_no, //商户订单编号;
"trade_no" => $trade_no, //支付宝交易号;
"total_fee" => $total_fee, //交易金额;
"trade_status" => $trade_status, //交易状态
"notify_id" => $notify_id, //通知校验ID。
"notify_time" => $notify_time, //通知的发送时间。
"buyer_email" => $buyer_email, //买家支付宝帐号
);

if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
if(!checkorderstatus($out_trade_no)){
orderhandle($parameter); //进行订单处理,并传送从支付宝返回的参数;
}
$this->redirect(C('alipay.successpage'));//跳转到配置项中配置的支付成功页面;
}else {
echo "trade_status=".$_GET['trade_status'];
$this->redirect(C('alipay.errorpage'));//跳转到配置项中配置的支付失败页面;
}
}else {
//验证失败
//如要调试,请看alipay_notify.php页面的verifyReturn函数
echo "支付失败!";
}
}
}
?>
复制代码
3、这里有几个支付处理过程中需要用到的函数,我把这些函数写到了项目的Common/common.php中,这样不用手动调用,即可直接使用这些函数,代码如下:
//////////////////////////////////////////////////////
//Orderlist数据表,用于保存用户的购买订单记录;
/* Orderlist数据表结构;
CREATE TABLE `tb_orderlist` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userid` int(11) DEFAULT NULL,购买者userid
`username` varchar(255) DEFAULT NULL,购买者姓名
`ordid` varchar(255) DEFAULT NULL,订单号
`ordtime` int(11) DEFAULT NULL,订单时间
`proctid` int(11) DEFAULT NULL,产品ID
`ordtitle` varchar(255) DEFAULT NULL,订单标题
`ordbuynum` int(11) DEFAULT '0',购买数量
`ordprice` float(10,2) DEFAULT '0.00',产品单价
`ordfee` float(10,2) DEFAULT '0.00',订单总金额
`ordstatus` int(11) DEFAULT '0',订单状态
`payment_type` varchar(255) DEFAULT NULL,支付类型
`payment_trade_no` varchar(255) DEFAULT NULL,支付接口交易号
`payment_trade_status` varchar(255) DEFAULT NULL,支付接口返回的交易状态
`payment_notify_id` varchar(255) DEFAULT NULL,
`payment_notify_time` varchar(255) DEFAULT NULL,
`payment_buyer_email` varchar(255) DEFAULT NULL,
`ordcode` varchar(255) DEFAULT NULL, //这个字段不需要的,大家看我西面的修正补充部分的说明!
`isused` int(11) DEFAULT '0',
`usetime` int(11) DEFAULT NULL,
`checkuser` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

*/
//在线交易订单支付处理函数
//函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;
//返回值:如果订单已经成功支付,返回true,否则返回false;
function checkorderstatus($ordid){
$Ord=M('Orderlist');
$ordstatus=$Ord->where('ordid='.$ordid)->getField('ordstatus');
if($ordstatus==1){
return true;
}else{
return false;
}
}

//处理订单函数
//更新订单状态,写入订单支付后返回的数据
function orderhandle($parameter){
$ordid=$parameter['out_trade_no'];
$data['payment_trade_no'] =$parameter['trade_no'];
$data['payment_trade_status'] =$parameter['trade_status'];
$data['payment_notify_id'] =$parameter['notify_id'];
$data['payment_notify_time'] =$parameter['notify_time'];
$data['payment_buyer_email'] =$parameter['buyer_email'];
$data['ordstatus'] =1;
$Ord=M('Orderlist');
$Ord->where('ordid='.$ordid)->save($data);
}

热点内容
视频点播服务器搭建局域网 发布:2025-01-12 15:46:44 浏览:87
unit长安豪华版有哪些配置 发布:2025-01-12 15:45:05 浏览:84
数据库表的分区 发布:2025-01-12 15:39:29 浏览:368
u点家庭服务器网关设置有什么用 发布:2025-01-12 15:33:15 浏览:152
王者归来java 发布:2025-01-12 15:27:13 浏览:67
安卓手机为什么卡又发热 发布:2025-01-12 15:23:18 浏览:570
如何验证root密码是否正确 发布:2025-01-12 15:23:15 浏览:591
socketftp服务器端 发布:2025-01-12 15:19:55 浏览:235
胸椎腰椎压缩性骨折 发布:2025-01-12 15:18:30 浏览:475
运营商清缓存 发布:2025-01-12 15:17:36 浏览:488