支付宝扫码支付模型 附OpenSSL工具windows编译版本 ThinkPHP3.2.3
代码只是实现了功能,不是太严谨,比如接收异步通知,没有验证通知是否来自支付宝
支付宝扫码支付<?php <br />
namespace CommonModel;<br>
use ThinkModel;<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>
}其他{<br>
$msg['code'] = 2;<br>
$msg['message'] = $callback['alipay_trade_precreate_response']['sub_msg'];<br>
}<br>
返回 $msg;<br>
}<br>
<br>
/*签名排序*/ <br>
公共函数 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>
如果($i==0){<br>
$stringToBeSigned.=“$k”。 “=”。 “$v”;<br>
} 其他 {<br>
$stringToBeSigned .=“&”。 “$k”。 “=”。 “$v”;<br>
}<br>
$i ;<br>
}<br>
}<br>
未设置($k,$v);<br> 返回 $stringToBeSigned;<br>
} <br>
<br>
/*校验$value是否非空*/<br>
公共函数 checkEmpty($value) {<br>
如果(!isset($值))<br>
返回 true;<br>
if ($value === null)<br>
返回 true;<br>
如果(修剪($值)===“”)<br>
返回 true;<br>
<br>
返回 false;<br>
}<br>
<br>
/*支付宝rsa签名方法*/<br>
公共函数 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>
返回 $sign;<br>
}<br>
<br>
/*支付宝发送请求*/<br>
公共静态函数 sendPostRequst($url, $data) {<br>
$postdata=http_build_query($data);<br>
//print_r($postdata);<br>
$opts=数组(<br>
'http' => 数组(<br>
'方法' => '发布',<br>
'标题' => '内容类型:application/x-www-form-urlencoded',<br>
'内容' => $postdata <br>
) <br>
);<br>
<br>
<br>
$context=stream_context_create($opts);<br>
<br>
$结果 = file_get_contents($url, false, $context);<br>
返回$结果;<br>
}<br>
<br>
<br>
/*支付宝退款<br>
¶m $pay_sn(支付宝流水号),$price(退款金额),$batch_no(退款订单号)<br>
*作者 zheng.wang(4995952@qq.com)<br>
*日期 2015-12-15 <br>
*/<br>
公共函数 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>
* 由 zheng.wang 创建。<br>
* 日期:2015年10月26日<br>
* 时间:15:29<br>
*/<br>
<br>
namespace HomeController;<br>
use ThinkController;<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元