一直以为想做线上支付必须要有营业执照,害得我和很多个人开发者一样,绕了很多圈子。尝试过一些第三方的接入(不稳定,担心跑路)。
原来支付宝是有个人支付接口的,利用支付宝的“当面付”接口就可实现个人版的线上支付,实时直接进入个人账户。
我需要在网站上实现一个打赏功能,首先需要在 支付宝开发者中心 申请一个网页&移动应用,如图
然后需要在能力列表添加“当面付”功能,签约的时候营业执照没有红色*,说明不是必填项,其他的功能签约时营业执照都是必填项。
签约成功后,下载SDK填写相应的配置进行调试
http://aopsdkdownload.cn-hangzhou.alipay-pub.aliyun-inc.com/demo/F2FPay_Demo_php.zip
配置文件是 f2fpay/config/config.php
支付宝公钥和商户私钥是通过支付宝开放平台开发助手生成的,可以在下图的选项里进行设置和查看
然后回调地址必须是一个线上能够访问到的地址。
配置完成后就可以在本地进行调试
支付宝返回的是一个二维码串,需要用专门的转换api进行转成成功二维码图片,支付宝官方用的二维码串转换工具是google的api,在我机器上图片是显示不出来的,应该是需要VPN才能使用,所有我从网上又找了一个api。
支付二维码能够正常显示后说明调试通了,就可以部署到项目中进行应用了,我的项目后端是PHP的框架TP5写的,以下介绍在框架中的具体应用。
支付流程:
1 : 页面点击成为好货推荐,调用订单生成接口,传商品id和登录用户id
2 : 订单接口生成订单数据,未支付状态,并将生成的 订单号、订单名称、订单金额 处理后通过curl访问调用二维码的文件并返回前端二维码图片src路径和订单id
3 : 用户支付成功后在回调方法里将回调数据写入日志文件,如果支付成功,根据回调数据里的订单号更新此订单的支付状态,以及其他的支付信息;
4 : 前端拿到二维码的src路径和订单id后,将二维码展示给用户,并利用ajax携带订单id参数每隔1秒请求订单状态接口,如果订单状态为已支付,提示“支付成功”
ThinkPHP5接入支付宝“当面付”流程
1.根据官方SDK里的 qrpay_test.php 文件的写法,把html部分删掉,不必要的请求参数删掉,返回格式json处理一下
2. 生成订单并返回二维码的路径及订单id
3. 回调处理
最后奉上订单方法里用到的生成待请求字符串的方法和cURL的方法,这些方法放到了公共文件common.php中
/**
* 生成待请求字符串
* @param $paramArr
* @param bool|true $sort 是否排序 默认排序
* @param bool|false $encode 是否urlencode处理 默认不处理
* @param bool|false $isnull 是否过滤空值字段 默认不过滤
* @param string|& $str 链接字符 默认&
* @return string 返回待签字符串
*/
function createSignStr ($paramArr, $sort = true, $encode = false, $isnull = false, $str = '&') {
$param_array = array();
if($sort){
ksort ( $paramArr );
reset ( $paramArr );
}
foreach ($paramArr as $key => $val) {
//$val = mb_convert_encoding($val,"GBK", "UTF-8");
if($isnull){
if($val === ''){
unset($paramArr[$key]);
}else{
if($encode){
$param_array[] = $key.'='.urlencode($val);
}else{
$param_array[] = $key.'='.$val;
}
}
}else{
if($encode){
$param_array[] = $key.'='.urlencode($val);
}else{
$param_array[] = $key.'='.$val;
}
}
}
$param_str = implode($str,$param_array);
return $param_str;
}
/**
* 发送请求
* @param $opts //已加密字符串
* @param $url //发送地址
* @return mixed //返回支付返回信息
*/
function sendHttpRequest($opts, $url) {
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false);//不验证证书
curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, false);//不验证HOST
curl_setopt ( $ch, CURLOPT_SSLVERSION, 1);
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $opts );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
// 运行cURL,请求网页
$html = curl_exec ( $ch );
curl_close ( $ch );
return $html;
}
到此整个流程就结束了,希望对你有所帮助,如有疑惑需要帮忙可以在下方留言或加我qq:1298025852