CEE_V2访问云支付

>>返回:CEE使用手册

目录


由于部署在CEE上的应用访问内网服务时需要通过虚拟IP,而支付发货回调URL必须读取服务器的实际IP,因此:
部署在CEE上的应用需要进行如下代码改造后,才能接入云支付。

1. 代码改造说明

1.1 CEE提供了固定的发货服务器实际IP,通过该IP做请求转发

部署在CEE上的应用在进行支付发货服务器配置时,要求填入服务器IP。 如下图所示:
unipay_6.png
请使用如下IP:

10.142.11.27,或者10.142.52.17

所有部署在CEE上的应用,支付发货回调URL的请求都会先发到如上的固定IP,然后再通过APPID,以及下面的cee_extend参数,转发到对应的应用下的支付相关Web服务上进行处理。

1.2 部署在CEE上的应用在发起支付请求时需增加CEE特有的参数

部署在CEE上的应用在发起支付请求时(详见v3/pay/buy_goods ),需增加一个特别的参数:cee_extend。该参数不参与签名计算。
该参数由发起支付请求所在的CEE Web服务的域名、版本号,wsname三个值组成,中间以*分割,这几个值都可以在生成的php-fpm配置文件里面获取。
详细说明如下:

(1)domain:发起支付请求所在的Web服务的域名([rsname].app[appid].twsapp.com,其中rsname由开发者自己指定)。
可通过PHP环境变量“CEE_DOMAINNAME”获取。

(2)version:发起支付请求所在的Web服务下的生效版本的版本号。
可通过PHP环境变量“CEE_VERSIONID”获取。

(3)wsname:[appid]_[rsname]。
可通过PHP环境变量“CEE_WSNAME”获取。

例如:
$cee_extend=getenv("CEE_DOMAINNAME").'*'.getenv("CEE_VERSIONID").'*'.getenv("CEE_WSNAME");
$params["cee_extend"]=$cee_extend;
最后得到例如 cee_extend=1.test.app12345.twsapp.com*1*12345_test

1.3 部署在CEE上的应用需要将支付相关代码放在指定目录下

部署在CEE上的应用,必须将支付相关代码都放到应用根目录下的“ceecloudpay”目录下
后台会默认屏蔽这个目录在外网的访问,避免出现安全问题。

1.4 改造完成后即可接入云支付

完成上述改造后,其它接入过程与一般应用接入云支付的过程一样,详见:支付接入流程

2. SDK及代码示例

2.1 SDK

请到SDK下载页面下载PHP SDK 3.0.4及以上版本的SDK。
其它语言版本的SDK即将发布,敬请期待。

2.2 PHP代码示例

注:实际开发时请勿直接使用下面的代码。相关库文件请到SDK下载页面下载PHP SDK 3.0.4及以上版本的SDK)
1. 提交支付请求:

require_once 'Cpay_for_CEE_V2.php';

//公共参数
$appid = 123456;
$appkey = '123456';
$server_name="1.254.254.22";//此处仅为示例,需要改成应用自己的服务器ip

//服务器时间戳
date_default_timezone_set ('Asia/Shanghai');
$ts=date("U");

//构造参数
$params=array(
'amt'=>20,
'appid'=>$appid,
'appmode'=>$appmode,
'goodsmeta'=>base64_encode($goodsmeta),
'goodsurl'=>$goodsurl,
'openid'=>$openid,
'openkey'=>$openkey,
'payitem'=>$payitem,
'pf'=>$pf,
'pfkey'=>$pfkey,
'ts'=>$ts
);

$sdk = new CloudCeePay($server_name,$appid,$appkey);
$ret = $sdk->buyGoods($params);
$ret['req'] = $params;
echo json_encode($ret);



2. 处理发货端请求(代码需要放到应用根目录下的“ceecloudpay”目录下。后台会默认屏蔽这个目录在外网的访问,避免出现安全问题):

//校验参数
require_once 'SnsSigCheck.php';
$params = array();
foreach ( $_REQUEST as $key => $val) {
if($key == 'sig' ) continue;
$params[$key] = $val;
}

//签名参数
$sign = SnsSigCheck::makeSig('GET', '/ceecloudpay/testpay.php', $params, '9cf186ee480acde83337348ceb1d1dc3&');注:特别注意标红的&不要遗漏。
if($sign == $_REQUEST['sig'])
{
// 这里请填入实际的发货处理逻辑
echo '{"ret":0, "msg":"OK"}';
}

else
{
// 这里请填入实际的发货出错逻辑
error_log ('sigcheck: failed\n',3,'/data/cloud/logs/pay.log');
echo '{"ret":"4","msg":"failed!"}';
}



2.3 Java代码示例

注:实际开发时请勿直接使用下面的代码。
相关库文件请到SDK下载页面下载Java SDK,目前的Java SDK尚不支持CEE访问云支付,开发者需要根据如下红色标注的代码添加CEE访问云支付的相关处理代码:

package cee.test;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import biz.source_code.base64Coder.Base64Coder;
import com.qq.open.OpenApiV3;
import com.qq.open.OpensnsException;


/**

* Servlet implementation class PayTest
*/


public class PayTest extends HttpServlet
{
private static final long serialVersionUID = 1L;
private static final String appid = "123456";
private static final String appKey = "123456";
private static final Log log = LogFactory.getLog(PayTest.class);
private String wsname = "";
private String version = "";
private String domain = "";
private String appmode;
private String goodsmeta;
private String goodsurl;
private String payitem;
private String openid;
private String openkey;
private String pf;
private String pfkey;
private String ts;

private static final String server_name="1.254.254.22"; //此处仅为示例,需要改成应用自己的服务器IP
/**

* @see HttpServlet#HttpServlet()
*/

public PayTest()
{

super();
// TODO Auto-generated constructor stub

}


/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// TODO Auto-generated method stub
process(request,response);
}

/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// TODO Auto-generated method stub
process(request,response);
}

//以下代码块是CEE访问云支付特有的处理逻辑
private void process(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//wsname 是提供的全局变量,可以直接获取
wsname = super.getServletContext().getInitParameter("CEE_WSNAME");

//domain和version和版本相关,请自行加入WEB-INF下的web.xml或者在代码中定义
//例如:
/*
<context-param>
<param-name>CEE_DOMAINNAME</param-name>
<param-value>1.app36715rs.app36715.twsapp.com</param-value>
</context-param>

<context-param>
<param-name>CEE_VERSIONID</param-name>
<param-value>1</param-value>
</context-param>

  • /



domain = super.getServletContext().getInitParameter("CEE_DOMAINNAME");
version = super.getServletContext().getInitParameter("CEE_VERSIONID");

appmode = request.getParameter("appmode");
goodsmeta = request.getParameter("goodsmeta");
goodsurl = request.getParameter("goodsurl");
payitem = request.getParameter("payitem");
openid = request.getParameter("openid");
openkey = request.getParameter("openkey");
pfkey = request.getParameter("pfkey");
pf = request.getParameter("pf");
ts = String.valueOf(System.currentTimeMillis() / 1000);

HashMap<String,String> params = new HashMap<String, String>();
params.put("amt", "20");
params.put("appid", appid);
params.put("appmode", appmode);
params.put("goodsmeta", Base64Coder.encodeString(goodsmeta));
params.put("goodsurl", goodsurl);
params.put("openid", openid);
params.put("openkey", openkey);
params.put("payitem", payitem);
params.put("pf", pf);
params.put("pfkey", pfkey);
params.put("ts", ts);

try
{
String resp = buyGood(params);
response.getWriter().write(resp);
}

catch (OpensnsException e)
{
e.printStackTrace();
log.debug(e.getMessage());
}
}

private String buyGood(HashMap<String,String> params) throws OpensnsException
{
String cee_extend = domain + "*" + version + "*" + wsname;
params.put("cee_extend", cee_extend);
String protocol = "https";
String scriptName = "/v3/pay/buy_goods";
OpenApiV3 sdk = new OpenApiV3(appid, appKey);
sdk.setServerName(server_name);
String resp = sdk.api(scriptName, params, protocol);
log.debug(resp);
return resp;
} }

以上信息是否解决您的问题?

Copyright © 1998 - 2019 Tencent. All Rights Reserved.

腾讯公司 版权所有

有问必答 返回顶部