系列目录

支付宝集成:http://www.cnblogs.com/nerve/p/3437879.html

系列说明

最近在帮朋友的系统安装支付模块(兑换网站积分),现在总结一些开发心得,希望对大家有用。这个系列会讲以下第三方支付平台的集成:

以后有更新其他平台也会写出来。

这次的支付系统是用来网站的积分充值。为了简化,这里采用的是1元RMB=1个网站积分的兑换。

这里,不会描述怎么申请支付平台的收款帐号。

开发环境

ThinkPHP 3.1.2 (我用的是标准版)

win7 + Apache2

mysql 5.1


汇潮支付有自己的接口文档:http://download.csdn.net/detail/ssrc0604hx/6635299

为了方便使用,我将此支付接口封装成Ecpss.php, 放在 ThinkPhp 的Vendor目录下:

在此类中,填写相应的商户号跟MD5Key(这些在申请了 汇潮支付后,都可以从汇潮网站得到的)。

然后在Ecpss类中,封装了html form 的生成,可以直接跳转到支付页面,下面是Ecpss.php的代码:

<?php
/**
* Ecpss.php
*==============================
*汇潮支付时用的库
*==============================
* by:0604hx 1053214511@qq.com
* Nov 20, 2013 9:02:58 PM
*/
class Ecpss{
/*
* 支付请求的配置
*/
var $config; var $MD5Key = ""; var $pay_url = "https://pay.ecpss.cn/sslpayment"; /**
* 构造函数
* 参数中应该包括:
* BillNo 订单号
* Amount 交易金额
* ReturnURL 返回路径
* products 商品信息
*
* @param unknown_type $c
*/
public function __construct($c=array()){
$this->config['MerNo'] = ""; //商户号,必须
$this->config['orderTime'] = date("YmdHis"); //请求时间,格式为 YYYYMMDDHHMMSS
$this->config['AdviceURL'] = "";
$this->config['defaultBankNumber'] = "";
$this->config['Remark'] = ""; //合并两个数组
$this->config = array_merge($this->config, $c);
} /**
* 生成支付html
*
* 默认使用post方式提交
*/
public function buildSubmitHtml(){
$this->config['SignInfo'] = $this->createSignInfo(); //生成表单
$sHtml = "<form id='ecpssForm' name='ecpssForm' action='".$this->pay_url."' method='post'>"; foreach ($this->config as $key => $val) {
$sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
} //submit按钮控件请不要含有name属性
$sHtml = $sHtml."<input type='submit' value='去支付'></form>"; $sHtml = $sHtml."<script>document.forms['ecpssForm'].submit();</script>"; return $sHtml;
} /**
* 生成签名
* 方式:
* MerNo&BillNo&Amount&ReturnURL&MD5key
* 连接起来进行 MD5 加密后字符串,并进行大写转换
*
* 参数之间必须添加&符号,比如:16885&B00001&1.00&http://ecpss.cn&keyvalue,各参数之间添加&符号进行连接
*/
private function createSignInfo(){
$sign = $this->config['MerNo']."&".$this->config['BillNo']
."&".$this->config['Amount']."&".$this->config['ReturnURL']."&".$this->MD5Key;
$sign = md5($sign);
//转换成大写
return strtoupper($sign);
} /**
* 对服务器返回的数据进行验证
* 参数的 md5校验串, BillNo & Amount & Succeed & MD5key
*/
public function verify(){
//$sign = $_REQUEST['BillNo']."&".$_REQUEST['Amount']."&".$_REQUEST['Succeed']."&".$this->MD5Key;
//return md5($sign) == $_REQUEST['MD5info'];
return $_REQUEST['Succeed'] == 88;
}
}
?>

注意:

Ecpss中的 verify方法是对汇潮服务器返回数据的校对,我按照接口文档的说明进行验证,结果一直无法验证通过,问了技术客服,也得不到答案。

后来我直接判断返回的数据中‘Succeed’一栏是否==88(88就是支付成功)

请大家慎重使用。

然后要使用这个类也比较方便, 下面列出使用方法:

 	/*
* ------------------------------------------------------------------------------------------------
* Start 汇潮支付
* ------------------------------------------------------------------------------------------------
*/
private function payWithEcpss($order){
vendor("Ecpss.Ecpss"); $e['BillNo'] = $order['tradeNo'];
$e['Amount'] = $order['price'];
$e['ReturnURL'] = C("HOST")."index.php/Order/backOnEcpss";
$e['AdviceURL'] = C("HOST")."index.php/Order/notifyOnEcpss";
$e['products'] = $order['subject']; $ecpss = new Ecpss($e);
echo $ecpss->buildSubmitHtml();
} /**
* 汇潮支付成功后返回的处理action
*/
public function backOnEcpss(){
$this->dealWithEcpssBack(true);
} /**
* 从ecpss得到的notify通知
*/
public function notifyOnEcpss(){
$this->dealWithEcpssBack(false);
} /**
* 处理汇潮的返回值
*
* @param unknown_type $isReturn true为return,false 为notify返回
*/
private function dealWithEcpssBack($isReturn=true){
vendor("Ecpss.Ecpss"); $orderLogDao = new OrderLogModel(); $ecpss = new Ecpss(); $orderLog['addDate'] = sqlDate(); $log = "notify from Ecpss,"; /**
* 通过验证
*/
if($ecpss->verify()){
//根据订单号获取订单
$DAO = new OrderModel();
$order = $DAO->where("tradeNo='".$_REQUEST['BillNo']."'")->find(); /*
* 如果status不为0,那么就不需要处理,防止重复处理
*/
if(isset($order)){
$orderLog['order_id'] = $order['id']; if($order['status'] == 0){
$resultInfo = $this->doAfterPaySuccess($DAO, $order); $log.= $resultInfo;
}else{
$log.= "但是订单已经被处理过了,无需重复处理!";
}
}else{
$orderLog['order_id'] = -1;
$log.= "但是订单号在本地数据库不存在!";
}
}else{
//验证不通过时,也记录下来
$log.= "但是验证不通过";
$orderLog['order_id'] = -1;
} $orderLog['log'] = $log." [返回值为:sign=".$_REQUEST['MD5info']." ".$this->buildEcpssInfo()." ]";
$orderLogDao->add($orderLog); if($isReturn)
redirect(__APP__."/Order/payResult?orderId=".$orderLog['order_id'], 0);
else
echo "ok";
} private function buildEcpssInfo(){
return '订单号='.$_REQUEST['BillNo']." 金额=".$_REQUEST['Amount']." 结果代码=".$_REQUEST['Succeed']." result code=".$_REQUEST['Result'];
}
/*
* ------------------------------------------------------------------------------------------------
* End 汇潮支付
* ------------------------------------------------------------------------------------------------
*/

(关于Order的字段,在“支付宝集成”中有相关说明)

【网站支付PHP篇】thinkPHP集成汇潮支付(ecpss)的更多相关文章

  1. 【网站支付PHP篇】thinkPHP集成支付宝支付(担保交易)

    目录 系列说明 开发环境 部署支付宝 支付请求 支付宝返回处理 系列说明 最近在帮朋友的系统安装支付模块(兑换网站积分),现在总结一些开发心得,希望对大家有用.这个系列会讲以下第三方支付平台的集成: ...

  2. 集成 WeChat SDK - 支付篇

    作者感言 惯例, 开头都是要说些东西的了, 随着现在的App越来越商业化, 很多公司的App都会集成第三方的支付SDK, 这样子的成本就比较低, 但是呢, 有很多朋友还是不太会集成, 也不太爱看集成文 ...

  3. 第四百零三节,python网站在线支付,支付宝接口集成与远程调试,

    第四百零三节,python网站在线支付,支付宝接口集成与远程调试, windows系统安装Python虚拟环境 首先保证你的系统已经安装好了Python 安装virtualenv C:\WINDOWS ...

  4. 【第十二篇】微信支付(APP)集成时碰到的问题(.net提示“无权限”、iOS跳转到微信支付页面中间只有一个“确定”按钮)(转)

    直入主题之前,请容我吐槽一下微*的官方东西:ASDFQ%#$%$#$%^FG@#$%DSFQ#$%.......:吐槽玩了!大家心照就好. 要完成手机APP跳转到微信的APP进行微信支付,需要进行如下 ...

  5. ThinkPHP中实现微信支付(jsapi支付)流程

    https://blog.csdn.net/sinat_35861727/article/details/72783988 之前写过一篇文章讲了 PHP实现微信支付(jsapi支付)流程 ,详见文章: ...

  6. 李洪强iOS开发支付集成之微信支付

    iOS开发支付集成之微信支付 微信支付也是需要签名的,也跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解). 1 - 集成前首先要看看文档 开 ...

  7. 李洪强iOS开发支付集成之支付宝支付

    iOS开发支付集成之支付宝支付 下载支付宝SDK 首先是开发包下载,还是比较难发现的,网上以前文章中的链接都打不开,我找了好久才找到的.最新的地址在这里(注意的是下载出来的SDK包里面并没有传说中的开 ...

  8. iOS开发支付集成之支付宝支付

    项目中要用到支付功能,需要支付宝,微信,银联三大支付,所以打算总结一下,写两篇文章,方便以后的查阅, 大家在做的时候也能稍微参考下,用到的地方避免再次被坑.这是第二篇支付宝集成,第一篇银联支付在这里. ...

  9. iOS开发支付集成之微信支付

    这一篇是<iOS开发之支付>这一部分的继支付宝支付集成,银联支付集成第三篇,微信支付.在集成的时候建议都要去下载最新版的SDK,因为我知道的前不久支付宝,银联都更新了一次,微信的不太清楚更 ...

随机推荐

  1. 【LeetCode】To Lower Case(转换成小写字母)

    这道题是LeetCode里的第709道题. 题目要求: 实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串. 示例 1: ...

  2. pat 1029 1029. 旧键盘(20)

    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在2行中分别给出应该输入的文字.以及实际 ...

  3. [Kubernetes]容器健康检查和恢复机制

    在Kubernetes中,可以为Pod里的容器定义一个健康检查探针(Probe),这样Kubernetes会根据这个Probe的返回值决定这个容器的状态,而不是直接以容器是否允许(来自Docker返回 ...

  4. spring中quartz的使用。【转http://www.cnblogs.com/kay/archive/2007/11/02/947372.html】

    注:从spring3到spring4改变 org.springframework.scheduling.quartz.CronTriggerBean org.springframework.sched ...

  5. RRAS

    远程访问控制是Windows NT.Win200x Server提供的一种远程服务,它允许用户从远端通过拨号连接连接到一个本地的计算机网络,一旦建立了连接,就相当于处在了本地的LAN中,从而可以使用各 ...

  6. 标准C程序设计七---02

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  7. Linux下AT&T汇编语法格式与Intel汇编语法格式异同

    由于绝大多数的国内程序员以前只接触过Intel格式的汇编语言,很少或几乎没有接触过AT&T汇编语言,虽然这些汇编代码都是Intel风格的.但在Unix和Linux系统中,更多采用的还是AT&a ...

  8. MongoDB数据关系的表达

    虽说MongoDB是非关系型数据库,但由于大部分情况下数据之间是存在关系的,所以MongoDB也需要一些方式来表达数据之间的关系.MongoDB表达数据关系的方式有两种:文档嵌套和数据库引用. 一.文 ...

  9. BB FlashBack pro导出AVI格式的配置参数

    文件-->导出,选择AVI格式在选择AVI解码器中选择Cinepak Codec by Radius压缩质量:建议6~12%点击确定在AVI导出选项中选择帧速率:4帧每秒音频选择格式 11.02 ...

  10. 数字IC设计入门必备——VIM自定义模板调用与VCS基本仿真操作示例

    一.前言 毕业论文答辩结束,闲下来写篇文章.芯片研发人员都在Linux系统下借助各种EDA工具和代码语言完成工作,因此提高代码开发效率,熟练运用开发工具是十分必要的.本文讲述VIM编辑神器的veril ...