折腾了小z老半天没弄到,最后自己给sae老大发了封email才搞到了邀请码。杯具。。
不知道sae是什么的童鞋请进:http://sae.sina.com.cn
话说sae禁用了很多函数,PDO和MySQLi也没有支持,连接MySQL必须使用官方封装的SaeMySQL进行数据库操作(查看文档和Sae官方封装的Sae*库,请点这里)
不过总的来说还是蛮不错的。现在着手进行各个开放平台的demo测试,后期进行App开发。嘿嘿,无限YY中……
PHP, SNS应用开发
app, sae, sns
不要把支付想象的有多复杂。不要以为涉及到钱了就很麻烦。其实支付宝、财付通、paypal真的很简单。
- <?php
-
- class PaymentAction extends Action {
-
- /**
- * 自己的paypal账号
- */
- private $account = 'XXXXX@gmail.com';
-
- /**
- * paypal支付网关地址
- */
- private $gateway = 'https://www.paypal.com/cgi-bin/webscr?';
-
- public function index() {
- echo '<a href="'.U('Payment/order').'">Payment this order.</a>';
- }
-
- /**
- * 生成订单并跳转到Paypal进行支付
- */
- public function order() {
- /**
- * 自己的逻辑代码
- * 判断是否登录、购买的哪个商品、购物车等等逻辑
- * 当然可以调用Model更简单点
- * 这里不在赘述
- */
- /** ...... **/
-
- $order_info = array();// 初始化订单数据
- $order_id = uniqid();// 按照自己的规则生成订单号入库
-
- /**
- * 订单包含哪几种商品、谁买的、什么时间、几件
- */
- $order_info['order_id'] = $order_id;
- $order_info['member_id'] = Session::get('member_id');
- /** .... **/
-
- $order = D('Order');
-
- if( $order->createOrder($order_info) ) {
- unset($order,$order_info);
- $pp_info = array();// 初始化准备提交到Paypal的数据
- $pp_info['cmd'] = '_xclick';// 告诉Paypal,我的网站是用的我自己的购物车系统
- $pp_info['business'] = $this->account;// 告诉paypal,我的(商城的商户)Paypal账号,就是这钱是付给谁的
- $pp_info['item_name'] = "支付订单:{$order_id}";// 用户将会在Paypal的支付页面看到购买的是什么东西,只做显示,没有什么特殊用途,如果是多件商品,则直接告诉用户,只支付某个订单就可以了
- $pp_info['amount'] = '13'; // 告诉Paypal,我要收多少钱
- $pp_info['currency_code'] = 'USD';// 告诉Paypal,我要用什么货币。这里需要注意的是,由于汇率问题,如果网站提供了更改货币的功能,那么上面的amount也要做适当更改,paypal是不会智能的根据汇率更改总额的
- $pp_info['return'] = 'http://www.domain.com/index.php/payment/finish';// 当用户成功付款后paypal会将用户自动引导到此页面。如果为空或不传递该参数,则不会跳转
- $pp_info['invoice'] = $order_id;
- $pp_info['charset'] = 'utf-8';
- $pp_info['no_shipping'] = '1';
- $pp_info['no_note'] = '1';
- $pp_info['cancel_return'] = 'http://www.domain.com/index.php/product/view/pid/3';// 当跳转到paypal付款页面时,用户又突然不想买了。则会跳转到此页面
- $pp_info['notify_url'] = 'http://www.domain.com/index.php/payment/notify/orderid/'.$order_id;// Paypal会将指定 invoice 的订单的状态定时发送到此URL(Paypal的此操作,是paypal的服务器和我方商城的服务器点对点的通信,用户感觉不到)
- $pp_info['rm'] = '2';
-
- $paypal_payment_url = $this->gateway.http_build_query($pp_info);
- echo "<a href='{$paypal_payment_url}'>Go Paypal!</a>";
- unset($pp_info);
- } else {
- $this->error(L('order_create_fail'));
- }
- }
-
- public function finish() {
- $this->success('购买成功');
- }
-
- public function notify() {
- // 由于这个文件只有被Paypal的服务器访问,所以无需考虑做什么页面什么的,这个页面不是给人看的,是给机器看的
- $order_id = (int) $_GET['orderid'];
- $order_info = D('Order')->getOrderDetail($order_id);
-
- // 由于该URL不仅仅只有Paypal的服务器能访问,其他任何服务器都可以向该方法发起请求。所以要判断请求发起的合法性,也就是要判断请求是否是paypal官方服务器发起的
-
- // 拼凑 post 请求数据
- $req = 'cmd=_notify-validate';// 验证请求
- foreach ($_POST as $k=>$v)
- {
- $v = urlencode(stripslashes($v));
- $req .= "&{$k}={$v}";
- }
-
- $ch = curl_init();
- curl_setopt($ch,CURLOPT_URL,'http://www.paypal.com/cgi-bin/webscr');
- curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
- curl_setopt($ch,CURLOPT_POST,1);
- curl_setopt($ch,CURLOPT_POSTFIELDS,$req);
- $res = curl_exec($ch);
- curl_close($ch);
-
- if( $res && !empty($order_info) ) {
- // 本次请求是否由Paypal官方的服务器发出的请求
- if(strcmp($res, 'VERIFIED') == 0) {
- /**
- * 判断订单的状态
- * 判断订单的收款人
- * 判断订单金额
- * 判断货币类型
- */
- if(($_POST['payment_status'] != 'Completed' && $_POST['payment_status'] != 'Pending') OR ($_POST['receiver_email'] != $this->account) OR ($_POST['mc_gross'] != 13) OR ('USD' != $_POST['mc_currency'])) {
- // 如果有任意一项成立,则终止执行。由于是给机器看的,所以不用考虑什么页面。直接输出即可
- exit('fail');
- } else {// 如果验证通过,则证明本次请求是合法的
- D('Order')->finishOrder($order_id);// 更改订单状态
- exit('success');
- }
- } else {
- exit('fail');
- }
- }
- }
- }
PHP, 电子商务
paypal, PHP, 支付接口, 电子商务
N多朋友问我要支付宝的测试代码。-_-真的觉得这东西就是拼凑URL而已。现在在这里放出来。
请求支付的代码:
- <?php
-
-
- // 可根据项目实际应用更改
- function url($array) {
- $gets = $_GET;
- $gets = array_merge($gets,$array);
- return '?'.http_build_query($gets);
- }
-
- $service = isset($_GET['service']) ? $_GET['service'] : 'create_direct_pay_by_user';
- $services = array(
- 'create_direct_pay_by_user' => '即时到账',
- 'create_partner_trade_by_buyer' => '担保交易',
- );
-
- if(!array_key_exists($service,$services)) exit('错误的交易类型');
-
- ?>
- <p style="border:2px dotted blue;width:auto;">
- <label>请选择交易类型:</label>
- <?php foreach ($services as $key=>$val): ?>
- <?php if($service == $key): ?>
- <b style="color:red"><?php echo $val; ?></b>
- <?php else: ?>
- <b><a href="<?php echo url(array('service'=>$key)); ?>"><?php echo $val; ?></a></b>
- <?php endif; ?>
- <?php endforeach; ?>
- </p>
- <?php
- function getRequestUrl($partner,$scode,$return_url,$charset,$subject,$body,$order,$lfee) {
- global $data,$service;
- # 支付宝交易类型
- $data['service'] = $service;//create_partner_trade_by_buyer[担保交易]create_direct_pay_by_user[即时到账]
- # 合作商户编号
- $data['partner'] = $partner;
- # 请求返回地址
- $data['return_url'] = $return_url;
- # 默认编码
- $data['_input_charset'] = $charset;
- # 默认支付渠道
- $data['paymenthod'] = 'bankPay';
- # 默认的网银
- $data['defaultbank'] = 'ICBCB2C';
- # 商品名称
- $data['subject'] = $subject;
- # 商品展示URL
- $data['show_url'] = 'http://www.c1991.com/demo/pay/?gateway=alipay&';
- # 异步通知返回
- $data['notify_url'] = 'http://www.c1991.com/demo/pay/callback.php?gateway=alipay&act=notify&order_id='.$order;
- # 商品简介
- $data['body'] = $body;
- # 商户订单号
- $data['out_trade_no'] = $order;
- # 物流配送费用
- $data['logistics_fee'] = $lfee;
- # 物流费用付款方式
- $data['logistics_payment'] = 'SELLER_PAY';//SELLER_PAY(卖家支付)、BUYER_PAY(买家支付)、BUYER_PAY_AFTER_RECEIVE(货到付款)
- # 物流配送方式
- $data['logistics_type'] = 'POST';//物流配送方式:POST(平邮)、EMS(EMS)、EXPRESS(其他快递)
- # 价格
- $data['price'] = '10.00';
- # 付款方式
- $data['payment_type'] = '5';
- # 商品数量
- $data['quantity'] = '1';
- # 卖家email
- $data['seller_email'] = '你签约用的支付宝帐号(可为手机号、用户名或email)';
- $data = array_filter($data);
-
- ksort($data);reset($data);
- $data['sign'] = md5(urldecode(http_build_query($data)).$scode);
- $data['sign_type'] = 'MD5';
-
- $url = 'https://www.alipay.com/cooperate/gateway.do?'.http_build_query($data);
- return $url;
- }
-
- $url = getRequestUrl('这里需要填写你在支付宝签约的商户合作ID','这里填写你你的合作密钥','http://www.你的callback路径.com/callback.php?gateway=alipay','UTF-8','测试商品','测试内容',uniqid(),'0.00');
由于可能涉及到一些敏感信息,callback和notify我就不贴了。其实也就那么回事。对照支付宝官方的开发手册。很简单的。^_^
PHP, 电子商务
api, 接口, 支付宝, 支付网关
工作地点:天津
公司地址:天津市南开区红旗路与鞍山西道交口慧谷大厦716-719
招聘人数:3-5人
要求:1、精通PHP/MySQL开发和Linux/Freebsd系统;
2、具有1年以上PHP5编程经验;
3、拥有良好的代码习惯,要求结构清晰,命名规范,逻辑性强,代码冗余率低;
4、具有MySQL优化、PHP缓存方面的经验;
5、能提供以前的作品展示或有相关的产品开发经验优先;
6、熟悉设计模式,理解面向对象的开发方式,有.NET或JAVA开发经验者优先。
公司电话:022-87631069 席姐姐(席蕊)
联系信箱:shopnc#gmail.com(#替换为@ 你懂的)
人在天津
公司, 招聘
SQLITE+MYSQL+POSTGRESQL+TT。。。强悍的组合不需解释。。
下离开开始正式折腾。
TokyoTyrant, 数据库
TokyoTyrant, 数据库
所有函数功能说明:
lib_time.php
gmtime()
P: 获得当前格林威治时间的时间戳 /$0
server_timezone()
P: 获得服务器的时区 /$0
local_mktime($hour = NULL , $minute= NULL, $second = NULL, $month = NULL, $day = NULL, $year = NULL)
P: 生成一个用户自定义时区日期的GMT时间戳
local_date($format, $time = NULL)
P: 将GMT时间戳格式化为用户自定义时区日期
gmstr2time($str)
P: 转换字符串形式的时间表达式为GMT时间戳
local_strtotime($str)
P: 将一个用户自定义时区的日期转为GMT时间戳
local_gettime($timestamp = NULL)
P: 获得用户所在时区指定的时间戳
local_getdate($timestamp = NULL)
P: 获得用户所在时区指定的日期和时间信息
(全文 …)
Ecshop二次开发
ecshop
HMAC-SHA1、HMAC-MD5等算法,在PHP5.1.X之后,可直接使用如下形式来计算
- echo hash_hmac('sha1',$data,$key);
如果加载了MHASH扩展,也可直接使用mhash来进行运算
- echo bin2hex(mhash(MHASH_SHA1, $data, $key));
如果PHP版本低于5.1.X或者没有加载Mhash、或HMAC扩展,可使用如下的通用方法来进行相应运算
- function hmac($key, $data, $hash="md5") {
- $b = 64;
- if (strlen($key) > $b)
- $key = pack("H*", call_user_func($hash, $key));
- $key = str_pad($key, $b, chr(0x00));
- $ipad = str_pad("", $b, chr(0x36));
- $opad = str_pad("", $b, chr(0x5c));
- $k_ipad = $key ^ $ipad ;
- $k_opad = $key ^ $opad;
-
- return call_user_func($hash, $k_opad . pack("H*", call_user_func($hash, $k_ipad . $data)));
- }
- echo hmac($key,$data,'sha1');
PHP
hash, hmac, md5, sha1, 算法