支付宝扫码支付模型 附OpenSSL工具windows编译版本 ThinkPHP3.2.3
代码只是实现了功能,不是太严谨,比如接收异步通知,没有验证通知是否来自支付宝
支付宝扫码支付<?php <br />
namespace Common\Model;<br>
use Think\Model;<br>
<br>
/*支付宝扫码支付模型<br>
*author zheng.wang(4995952@qq.com)<br>
*date 2015-12-15<br>
*/<br>
<br>
// +----------------------------------------<br>
// | 打发士大夫的<br>
// +----------------------------------------<br>
// | 大法师<br>
// +----------------------------------------<br>
class PayModel extends Model {<br>
private $ali_app_id = '20151210000000000'; //APPID<br>
private $ali_notify_url = 'http://www.19981.com/Home/Notify/aliNotify'; //支付宝结果异步通知<br>
private $wx_notify_url = 'http://www.19981.com/Home/Notify/aliNotify'; //支付宝结果异步通知<br>
<br>
<br>
/*支付宝扫码支付<br>
*param $data=array('out_trade_no'=>'订单号','total_amount'=>'商品金额','subject'=>'商品名称','time_expire'=>'支付过期时间');<br>
*author zheng.wang(4995952@qq.com)<br>
*date 2015-12-15<br>
*/<br>
public function aliPay($data){<br>
$url = "https://openapi.alipay.com/gateway.do"; //支付宝网关<br>
$params['app_id'] = $this->ali_app_id ; <br>
//biz_content 业务参数需要使用json格式<br>
$biz_content['out_trade_no'] = $data['out_trade_no']; //网站订单号<br>
$biz_content['total_amount'] = $data['total_amount']; //订单金额<br>
$biz_content['subject'] = $data['subject']; //商品名称<br>
$biz_content['time_expire'] = date('Y-m-d H:i:s',$data['time_expire']); //订单过期时间<br>
$params['biz_content'] = json_encode($biz_content); <br>
// $time_expire = date('Y-m-d H:i:s',$data['time_expire']); //订单过期时间<br>
// $params['biz_content']="{\"out_trade_no\":\"" . $data['out_trade_no'] . "\",";<br>
// $params['biz_content'].="\"total_amount\":\"" . $data['total_amount']. "\",";<br>
// $params['biz_content'].="\"subject\":\"" . $data['subject'] . "\",";<br>
// $params['biz_content'].="\"time_expire\":\"" . $time_expire . "\"}"; <br>
$params['charset'] = 'utf-8' ; <br>
$params['method'] = 'alipay.trade.precreate' ;<br>
$params['notify_url'] = $this->ali_notify_url ;<br>
$params['sign_type'] = 'RSA' ;<br>
$params['timestamp'] = date('Y-m-d H:i:s',time()) ;<br>
$params['version'] = '1.0' ;<br>
//生成签名 A-Z排序<br>
// $rsaString = 'app_id='.$params['app_id'].'&biz_content='.$params['biz_content'].'&charset='.$params['charset'].'&method='.$params['method'].'¬ify_url='.$params['notify_url'].<br>
// '&sign_type='.$params['sign_type'].'×tamp='.$params['timestamp'].'&version='.$params['version'];<br>
<br>
$rsaString = $this->getSignContent($params);<br>
$params['sign'] = $this->rsa_sign($rsaString);<br>
//支付请求<br>
$callback = self::sendPostRequst($url, $params);<br>
$callback = json_decode(iconv("GBK", "UTF-8", "$callback"),true); //编码转为utf-8<br>
//返回结果<br>
if($callback['alipay_trade_precreate_response']['code'] == '10000'){<br>
$msg['code'] = 1;<br>
$msg['message'] = $callback['alipay_trade_precreate_response']['msg'];<br>
$msg['qr_code'] = $callback['alipay_trade_precreate_response']['qr_code'];<br>
}else{<br>
$msg['code'] = 2;<br>
$msg['message'] = $callback['alipay_trade_precreate_response']['sub_msg'];<br>
}<br>
return $msg;<br>
}<br>
<br>
/*签名排序*/ <br>
public function getSignContent($params) {<br>
ksort ( $params );<br>
<br>
$stringToBeSigned = "";<br>
$i = 0;<br>
foreach ( $params as $k => $v ) {<br>
if (false === $this->checkEmpty ( $v ) && "@" != substr ( $v, 0, 1 )) {<br>
if ($i == 0) {<br>
$stringToBeSigned .= "$k" . "=" . "$v";<br>
} else {<br>
$stringToBeSigned .= "&" . "$k" . "=" . "$v";<br>
}<br>
$i ++;<br>
}<br>
}<br>
unset ( $k, $v );<br>
return $stringToBeSigned;<br>
} <br>
<br>
/*校验$value是否非空*/<br>
public function checkEmpty($value) {<br>
if (! isset ( $value ))<br>
return true;<br>
if ($value === null)<br>
return true;<br>
if (trim ( $value ) === "")<br>
return true;<br>
<br>
return false;<br>
}<br>
<br>
/*支付宝rsa签名方法*/<br>
public function rsa_sign($data) {<br>
$private_key = VENDOR_PATH.'Alipay/Key/rsa_private_key.pem'; //私钥路径*********************<br>
$priKey = file_get_contents ($private_key);<br>
$res = openssl_get_privatekey ( $priKey );<br>
openssl_sign ( $data, $sign, $res );<br>
openssl_free_key ( $res );<br>
$sign = base64_encode ( $sign );<br>
return $sign;<br>
}<br>
<br>
/*支付宝发送请求*/<br>
public static function sendPostRequst($url, $data) {<br>
$postdata = http_build_query ( $data );<br>
//print_r($postdata);<br>
$opts = array (<br>
'http' => array (<br>
'method' => 'POST',<br>
'header' => 'Content-type: application/x-www-form-urlencoded',<br>
'content' => $postdata <br>
) <br>
);<br>
<br>
<br>
$context = stream_context_create ( $opts );<br>
<br>
$result = file_get_contents ( $url, false, $context );<br>
return $result;<br>
}<br>
<br>
<br>
/*支付宝退款<br>
¶m $pay_sn(支付宝流水号),$price(退款金额),$batch_no(退款订单号)<br>
*author zheng.wang(4995952@qq.com)<br>
*date 2015-12-15 <br>
*/<br>
public function aliRefund($pay_sn,$price,$batch_no){<br>
$url = "https://openapi.alipay.com/gateway.do";<br>
$params['app_id'] = $this->ali_app_id ; <br>
//biz_content 业务参数需要使用json格式<br>
// $biz_content['trade_no'] = $pay_sn; //支付宝订单号<br>
// $biz_content['total_amount'] = $price; //退款金额<br>
// $biz_content['out_request_no'] = $batch_no; //退款订单号<br>
$params['biz_content'] = $biz_content = "{\"trade_no\":\"". $pay_sn . "\",\"refund_amount\":\""<br>
. $price<br>
. "\",\"out_request_no\":\""<br>
. $batch_no<br>
. "\",\"refund_reason\":\"reason\",\"store_id\":\"store001\",\"terminal_id\":\"terminal001\"}";<br>
$params['charset'] = 'utf-8' ; <br>
$params['method'] = 'alipay.trade.refund';<br>
$params['sign_type'] = 'RSA' ;<br>
$params['timestamp'] = date('Y-m-d H:i:s',time()) ;<br>
$params['version'] = '1.0' ;<br>
//生成签名<br>
$data = 'app_id='.$params['app_id'].'&biz_content='.$params['biz_content'].'&charset='.$params['charset'].'&method='.$params['method'].<br>
'&sign_type='.$params['sign_type'].'×tamp='.$params['timestamp'].'&version='.$params['version'];<br>
<br>
$params['sign'] = $this->rsa_sign($data);<br>
//支付请求<br>
$callback = self::sendPostRequst($url, $params);<br>
$callback = json_decode(iconv("GBK", "UTF-8", "$callback"),true); <br>
//退款成功返回结果给<br>
//return $callback;<br>
var_dump($callback);<br>
} <br>
<br>
}
支付宝异步通知
没有写通知验证,可以自己写哈<?php <br />
/**<br>
* Created by zheng.wang.<br>
* Date: 2015-10-26<br>
* Time: 15:29<br>
*/<br>
<br>
namespace Home\Controller;<br>
use Think\Controller;<br>
<br>
class NotifyController extends Controller{<br>
<br>
/**<br>
* 支付宝异步通知<br>
* @param unknown $order_sn 订单号<br>
* @param unknown $type 支付类型 ALI/WEIXIN<br>
* @param unknown $result 支付结果 SUCCESS/FAIL<br>
* @param array $data <br>
* 支付成功时 $data['pay_time'] 支付完成时间<br>
* 支付成功时 $data['pay_sn'] 支付流水号<br>
* <br>
* 支付失败时 $data['pay_time'] 支付完成时间<br>
* 支付失败时 $data['pay_sn'] 支付流水号 <br>
*/ <br>
public function aliNotify(){<br>
//接收支付异步通知post数据<br>
$callBackData = $_POST;<br>
//订单记录日志<br>
file_put_contents('./Application/Runtime/Logs/xs_pay_alipay_notify.log', json_encode($callBackData), FILE_APPEND );<br>
if($_POST['trade_status'] == 'TRADE_SUCCESS'){<br>
//支付成功<br>
$data['pay_time'] = strtotime($_POST['gmt_payment']);<br>
$data['pay_sn'] = $_POST['trade_no'];<br>
$res = D('Common/XsOrder')->payCallback($_POST['out_trade_no'], 'ALI', 'SUCCESS', $data);<br>
if($res !== false){<br>
//处理完完成后通知支付宝<br>
echo "success"; <br>
}<br>
}<br>
}<br>
<br>
<br>
}
thinkphp支付宝扫码支付.zip ( 1.27 MB 下载:45 次 )
AD:真正免费,域名+虚机+企业邮箱=0元