PHP怎么解析微信支付结果返回的xml

PHP怎么解析微信支付结果返回的xml,第1张

$input = file_get_contents('php://input');

if (!empty($input) && empty($_GET['out_trade_no'])) {

    $obj = simplexml_load_string($input, 'SimpleXMLElement', LIBXML_NOCDATA);

    $data = json_decode(json_encode($obj), true);

    //根据$data处理自己所要的逻辑

}

$data具体参数看微信文档,最常用的是:out_trade_no(商户订单号)、transaction_id(微信交易号)、result_code(交易状态)

交易状态如果是success记得处理完逻辑后返回一个success,不然微信会认为你的处理未完成而继续向服务器发送请求

//回调函数

function callback(){

//判断对象的状态是否完成

//alert(xmlhstatus);

if(xmlhreadyState==4){

if(xmlhstatus ==200){ //等于200表示成功

//alert("成功了");

//获取服务器端返回的数据

//纯文本

//var respons = xmlhresponseText;

//var text = respons;

var domObj = xmlhresponseText;

}

}

}

domObj就是服务器返回后的数据,如果是空的,只能说明是你服务器有问题

ASHX是一个HttpHandler

所以 如果楼主熟悉ASP_NET结构 可能会更加了解一些:

Page和Handler都需要一个上下文环境的 这个环境在CLR中为HttpContext 这个对象包含了WEB请求的Request Response等信息

只是Page类的HttpContext微软已经帮你做好了 所以你直接可以使用PageRequest之类的 其实这只是对HttpContext的一个引用

HttpHandler和Page不一样 要实现一个HttpHandler,必须通过IHttpHandler这个接口实现 因为这不是一个类 微软是不可能帮你先封装好Request Response之类的数据了

为了使开发人员可以使用Request之类的数据 微软为IHttpHandler提供了一个这样的方法:void ProcessRequest (HttpContext context);

所以你可以通过contextRequestForm["aaa"]这样的方法来获取参数

简单示例如下:

public class HttpHandlerA:IHttpHandler

{

public void ProcessRequest(HttpContext context)

{

string param = contextRequestForm["aaa"];

contextResponseClearContent();

contextResponseContentType="text/xml";

contextResponseContentEncoding = EncodingUTF8;

contextResponseCacheSetExpires(DateTimeNow);

contextResponseWrite("<xml version=\"10\" encoding=\"utf-8\" >");

contextResponseWrite("<XML>");

contextResponseWrite(param);

contextResponseWrite("</XML>");

contextResponseEnd();

}

}

此外 HttpContextCurrentRequestForm["aaa"]应该也是有用的

希望对楼主有用

一. 必备知识

1wsdl(web服务标记语言)

WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。

具体参考请访问下面网址

http://wwww3schoolcomcn/wsdl/indexasp

2soap

SOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息。

具体参考请访问下面网址

http://wwww3schoolcomcn/soap/indexasp

3php扩展

具体参考请访问下面网址

http://phpnet/manual/en/booksoapphp

二. php soap开发模式

1 working in swdl mode(契约先行(Contract first)模式)

  契约先行模式使用了一个用XML定义的服务接口的WSDL文件。WSDL文件定义了服务必须实现或客户端必须使用的接口。SoapServer和SoapClient的WSDL模式就基于这个概念。也就是用soap通讯的时候必须先有一个定义过的服务接口,才能进行通讯。

  

2 working in non-swdl mode(代码先行(Code first)模式)

在代码先行模式中,首先要先写出实现服务的代码。然后在大多数情况下,代码会产生一个契约,换种说法,一个WSDL。接着客户端在使用服务的时候就可以使用那个WSDL来获得服务的接口。尽管如此,PHP5的扩展并没有从代码输出一个WSDL的规定,考虑到这种情况,可以在non-WSDL模式下使用 SoapServer和SoapClient。也就是说在soap通讯的时候并不需要一个预先定义过的服务接口,代码会自动的产生。

三.参考例子:

  下面介绍如何使用WSDL模式和non-WSDL模式来实现服务和客户端。相对而言,使用WSDL模式来实现服务和客户端会比较容易。

1 noWSDL模式实现

服务端 serverphp

<php

class test

{

/

@return string

/

function show()

{

return 'hello world!';

}

}

#####################################################

$server = new SoapServer(null, array('uri' => "http://test-uri/"));

$server->setClass('test');

$server->handle();

>

客户端 clientphp

<

$soap=new SoapClient(null, array(

'location' =>'http://soapserver_url/serverphp',

'uri' => "http://test-uri/"));

print_r($soap->__getFunctions());

echo $soap->show();

>

2 WSDL模式实现

第一步:编写服务端类文件

classphp

<php

class test

{

/

@return string

/

function show()

{

return 'hello world!';

}

}

>

第二步:将类文件生成 wsdl文件serverwsdl。

由于wsdl文件编写比较复杂,所以我们用第三方工具生成。我们以zend studio为例子演示:

Tools ==> WSDL Generator ==> Configration name : test; WSDL file name: server

==>NEXT ==> 点击 + ==> 选择上面的创建的classphp ==> 这时候会看到一个 classes : URL Location的映射,保留 test类前面的勾,并将其url 设置为 SOAP Server的url:http://soapserver_url/serverphp ==>点击Finish,ZDE就会创建一个非常漂亮的WSDL了 工作基本上完成了

第三步:服务端编写:

<php

require ' classphp '; //引入类文件

$server = new SoapServer('serverwsdl');

$server->setClass('test');

$server->handle();

>

第四步:客户端编写

$soap = new SoapClient('http:// soapserver_url/serverwsdl');

print_r($soap->__getFunctions());

echo $soap->show();

以上两个例子只是一个简单的soap服务编写,已经可以满足大部分需要。如果需要更加高级的功能请参考其他方面的资料。

三. 出现的问题。

1在方法中对属性的赋值在其他方法中不起作用。

比如在客户端调用服务端某个方法对某个属性赋值。

在其他方法里就不能用。但在 __construct 方法中对属性的赋值是可以个在其他方法中使用的。

2 提示 Client] looks like we got no XML document错误。

服务器端文件在<php > 标签前后都不要有任何数据包括空格,空行。

3 Warning: SoapClient::SoapClient(): I/O warning : failed to load external entity

原因如下:PHP程序作为 SOAP客户端 采用 WSDL 模式访问远端服务器的时候,PHP是通过调用 libcurl 实现的。至少在 PHP52X 是这样的。如果采用 non-WSDL 模式,就不需要 libcurl。在solaris 没有缺省安装 libcurl,也许是我没有安装。除了 了ibcurl以外,至少还关联的库包括:

libidn,ibgcc,libiconv,libintl,openssl

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » PHP怎么解析微信支付结果返回的xml

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情