**
TP5加支付宝手机网站支付配置
**
调用支付宝接口的第一天:
之前申请审核手机网站弄了好久,不过审核还挺快的,一天内就审核好了,提交审核必须要有一个测试页面,测试页面中要有货名、单价、重量、合计,我之前是测试页面不达标浪费了很多时间,希望能尽早把这个搞定。
审核完后一看sdk和demo加文档,
这啥啊,什么东西。结果第一天只把沙箱环境配好了,还有秘钥也重新弄好了,demo还没自己本地跑起来,秘钥是加密接口的,要把公钥上传到支付宝,秘钥自己保存好。支付宝沙箱的网关和正式环境的网关是不一样的,多了一个dev
先讲一讲沙箱的配置:
需要设置的就是应用公钥,支付宝公钥会自动生成,我这里用的是rsa秘钥,rsa和rsa2的区别就是长度不一样,支付宝提供了签名工具,自己下载一下,然后选择对应的语言,其实只有两种选择,一种java,一种非java,生成秘钥和公钥。不知道为啥,我明明设置的秘钥长度为2048,但是产生的是rsa的1024的长度,这个真不知道了,所以我这里提交的是rsa公钥。
调用支付宝接口的第二天
今天把手机网站支付的demo跑起来了,用xampp,xampp的配置不说了,然后把项目放到xampp打开的目录下,点击Admin即可打开
注意,想要本地使用的话还需要自己配置demo中的config.php文件,appid,秘钥是签名工具生成的自己要保存好,支付宝公钥在沙箱中看一下就好了。自己填一下。
$config = array ( //应用ID,您的APPID。'app_id' => "",//商户私钥,您的原始格式RSA私钥'merchant_private_key' => "",//异步通知地址'notify_url' => "http://工程公网访问地址/alipay.trade.wap.pay-PHP-UTF-8/notify_url.php",//同步跳转'return_url' => "http://mitsein.com/alipay.trade.wap.pay-PHP-UTF-8/return_url.php",//编码格式'charset' => "UTF-8",//签名方式'sign_type'=>"RSA",//支付宝网关'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。'alipay_public_key' => "",);
正式环境可以改config配置,然后接着就是测试第一个接口,打开出现以下页面
点击确定
这里选择账号登录,
输入沙箱环境下的买家账号密码,
确认付款
输入密码
完成!
沙箱账号可有钱了
据说android手机可以下载支付宝沙箱,莫名幸福!
配置到tp5的服务器上有点复杂。
我是把demo放进去的,然后模仿demo中的pay.php写了一段代码:
这段代码初始我是当做一个接口写的,前端vue访问这个接口,然后后来发现并不是这么简单,先看代码。
<?phpnamespace app\api\controller;use app\common\controller\ControllerBase;
use think\Db;
use think\Request;
vendor('alipay/demo/AopSdk');
use alipay\demo\AopSdk;
vendor('alipay/demo/wappay/service/AlipayTradeService');
use alipay\demo\wappay\service\AlipayTradeService;
vendor('alipay/demo/wappay/buildermodel/AlipayTradeWapPayContentBuilder');
use alipay\demo\wappay\buildermodel\AlipayTradeWapPayContentBuilder;
class Alipay
{/*** 测试*/public function pay(){$config = array ( //应用ID,您的APPID。'app_id' => "",//商户私钥,您的原始格式RSA私钥'merchant_private_key' => "",//异步通知地址'notify_url' => "",//同步跳转'return_url' => "",//编码格式'charset' => "UTF-8",//签名方式'sign_type'=>"RSA",//支付宝网关'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。'alipay_public_key' => "",);$price = input('post.price');//商户订单号,商户网站订单系统中唯一订单号,必填$out_trade_no = 1;//订单名称,必填$subject = '测试';//付款金额,必填$total_amount = $price;//商品描述,可空$body = '商品描述测试';//超时时间$timeout_express="1m";$payRequestBuilder = new \AlipayTradeWapPayContentBuilder();$payRequestBuilder->setBody($body);$payRequestBuilder->setSubject($subject);$payRequestBuilder->setOutTradeNo($out_trade_no);$payRequestBuilder->setTotalAmount($total_amount);$payRequestBuilder->setTimeExpress($timeout_express);$payResponse = new \AlipayTradeService($config);$result['data'] = $payResponse->wapPay($payRequestBuilder,$config['return_url'],$config['notify_url']);$result['msg']='hello';//测试接口用return json($result);}
}
我觉得最难就是:致命错误,该类不存在
建议把php的显示错误行和错误信息打开,不然不知道报错是为什么就难受了。
我以为只要AopSdk.php加进去就可以了,sdk的入口加进去还需要自己导入别的类,而且new后面要加一个反斜杠,是因为命名空间的原因,如果当前类中没有,就去全局搜索这个类,然后出现了写log的权限问题,有点复杂。
调用支付宝接口的第三天
今天老师把写log的权限打开了,已经不会出现不能写log的情况,写log是支付宝AlipayTradeService接口类的一个函数,我是写到了log文件夹下面,这样就不会因为权限问题导致服务器被攻击,现在的log文件夹是所有人都可以写的权限。
//请确保项目文件有可写权限,不然打印不了日志。function writeLog($text) {// $text=iconv("GBK", "UTF-8//IGNORE", $text);//$text = characet ( $text );file_put_contents ( dirname ( __FILE__ ).DIRECTORY_SEPARATOR."./../../log/log.txt", date ( "Y-m-d H:i:s" ) . " " . $text . "\r\n", FILE_APPEND );}
这里新建了一个log文件夹用来存放log。但是出现了新问题!
这个函数是AopClient接口类中调用了,具体好像是用来配置编码的….
百度到的一段话:
“因为调用接口时使用的参数里面有中文,调用接口会出现异常问题,后来才明白是编码不一致的问题。然而,我本地项目开发使用的是utf-8,接口那边也是需要utf-8的,那么问题来了,到底哪里的编码不一致呢?
请教了一下高手,原来是php的扩展mbstring没有开启,下面就是开启mbstring扩展,并配置支持utf-8编码的方法:
首先,去掉;extension=php_mbstring.dll 前面的“;”号,开启mbstring扩展;
然后,将对应项都改成下面的值:
mbstring.language = Chinese
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On
mbstring.http_input = UTF-8
mbstring.http_output = UTF-8
mbstring.detect_order = UTF-8
mbstring.substitute_character = none”
上面是怎么修改php.ini这个文件,下面是怎么找这个文件,
想要找到php.ini文件并修改这些内容可以在我上面的接口里写一个phpinfo(),然后就可以在network中看到目录了。没图,不想再改回去。
来,已经修改好了上面的东西,如果到这一步没什么问题的话,访问到写的接口的时候就会返回一个form表单,这是支付宝sdk已经做好的事情,我们不用管。
接下来就是整合到tp5的框架中去了。
首先要知道一件事,访问上面的pay接口的时候返回的是一个表单,所以我们要认识到其实这个pay文件不应该是一个接口,而应该是一个tp5的模板文件,把返回的内容写到渲染的模板中。这么一想就简单了,支付宝的demo中已经做好了这件事情,就先修改一下上面的那个文件。
修改成下图所示代码:
<?phpnamespace app\index\controller;/*** 前端首页控制器*/
use think\Db;
use think\Request;
use think\Controller;
vendor('alipay/demo/AopSdk');
use alipay\demo\AopSdk;
vendor('alipay/demo/wappay/service/AlipayTradeService');
use alipay\demo\wappay\service\AlipayTradeService;
vendor('alipay/demo/wappay/buildermodel/AlipayTradeWapPayContentBuilder');
use alipay\demo\wappay\buildermodel\AlipayTradeWapPayContentBuilder;class Alipay extends controller
{public function pay(){$config = array (//应用ID,您的APPID。'app_id' => "",//商户私钥,您的原始格式RSA私钥'merchant_private_key' => "",//异步通知地址'notify_url' => "",//同步跳转'return_url' => "http://balala.edianlai.com/index/client/client_login#/?pcbid=pcbgfdg",//编码格式'charset' => "UTF-8",//签名方式'sign_type'=>"RSA",//支付宝网关'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。'alipay_public_key' => "",);// $price = input('post.price');//商户订单号,商户网站订单系统中唯一订单号,必填$out_trade_no = 2;//订单名称,必填$subject = '测试';//付款金额,必填$total_amount = 0.02;//商品描述,可空$body = '商品描述测试';//超时时间$timeout_express="1m";$payRequestBuilder = new \AlipayTradeWapPayContentBuilder();$payRequestBuilder->setBody($body);$payRequestBuilder->setSubject($subject);$payRequestBuilder->setOutTradeNo($out_trade_no);$payRequestBuilder->setTotalAmount($total_amount);$payRequestBuilder->setTimeExpress($timeout_express);$payResponse = new \AlipayTradeService($config);$result = $payResponse->wapPay($payRequestBuilder,$config['return_url'],$config['notify_url']);return;}
}
这是一个前端的控制器,我把它命名为Alipay.php,里面的pay方法是返回到的页面的名字,pay代表了pay.html,tp5的模板渲染。
上面的商户订单号在测试的时候一定要注意:如果这次测试以及完成,并且以及成功支付了,那就不要再用同一个订单号了,否则会出现错误。
这里做一次展示所以数据我写死了。
否则会出现下图所示错误
然后我们可以直接复制demo中的pay.php的html部分代码,新建一个pay.html文件,粘贴代码。Pay.php在demo的wappay下面。
由于我的前端是用vue做的,vue放到服务器上每一次都要打包,测试实在复杂,所以我这里简单化了,点击支付
调用pay方法,打开前面页面控制器alipay中的pay.html页面,这时候,alipay的pay里面已经通过支付宝的sdk完成我们需要做的一切。
会打开一个新的页面,
继续支付,然后账号密码登录,账号密码就用沙箱提供了账号密码即可,支付的过程就和上面的一样了。
确认支付!
输入支付密码就ok了
支付成功后应该会回跳,我还没设置。
这样就完成了tp5+支付宝手机网站支付功能。
心得:配置真的要命,写博客的意义在于记住血一样的教训并且指导大家不要再次犯错,作为一个新人,欢迎指出错误。