Maison  >  Article  >  php教程  >  支付宝扫码支付模型 附OpenSSL工具windows编译版本

支付宝扫码支付模型 附OpenSSL工具windows编译版本

WBOY
WBOYoriginal
2016-06-07 11:36:011192parcourir

支付宝扫码支付模型 附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元

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:dateArticle suivant:深入理解Linux下的复制文件cp命令