app微信支付 php回调接口,App微信支付之php后台接口详解

本文将和大家介绍App微信支付(2016.10.11)的php(7.0)后台支付和回调接口,框架是Thinkphp5.0:希望能帮助到大家。账户的各种参数

订单信息

请求prepay_id

*返回APP数据处理

微信回调

修改订单状态

账户的各种参数账户的各种参数就是像微信申请app支付的时候会给你的账户邮箱发邮件,里面会有对应的微信支付分配的商户号(MCHID),APPID和APPSECRET是在申请app支付权限的时候返回的,还有KEY需要自己在用户微信的商家后台里面自己设置的,这个很重要!避免外泄!

订单信息**客户端会把购物车里面的商品数据传到后台,还包括用户的信息等,拿到数据后首先需要验证这些数据,这里的验证一般都会在项目初期就和客户端定好传输规则,比如传输方式,参数名,验证参数的方式,这里的重点就是验证,一般都会采用签名认证的方式:

//签名步骤一:按字典序排序参数;

这里给出(格式化参数格式化成url参数)代码实例:/**

* 格式化参数格式化成url参数

*/

public function ToUrlParams()

{

$buff = "";

foreach ($this->values as $k => $v)

{ if($k != "sign" && $v != "" && !is_array($v)){

$buff .= $k . "=" . $v . "&";

}

}

$buff = trim($buff, "&"); return $buff;

}//签名步骤二:在string后加入KEY(这个KEY与前端人员协商而定);

//签名步骤三:MD5加密;

//签名步骤四:所有字符转为大写

这些最好在项目初期就封装好,后期会只要调用就好,例:

(后期只需要, $param = $this->request('参数名'));即可), 然后将订单信息预存储.

请求prepay_id

这里我就直接上代码吧,(这里给出接口文档下载地址:),虽然网上也有很多自己写请求接口,但是既然微信已经封装好了,用就行了:$input = new \app\wxpay\WxPayUnifiedOrder();//这里引用微信的统一下单接口

$input->SetBody($data['gname']['g_name']);//商品或支付单简要描述

$input->SetAttach($data['gname']['g_name']);//置附加数据

$input->SetOut_trade_no($order_sn); // 商户订单号

$input->SetTotal_fee(intval($data['data']['order_price']*100));

$input->SetTime_start(date("YmdHis"));//订单生成时间

$input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间

$input->SetGoods_tag($data['gname']['g_name']); //商品标记

$input->SetNotify_url("http://www.weixin.qq.com/wxpay/notify.php"); // 支付成功后的回调地址,

$input->SetTrade_type("APP");

$order = \app\wxpay\WxPayApi::unifiedOrder($input);return $order['prepay_id'];

这里给出微信官方统一下单接口说明地址:

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

返回客户端信息$info = array();

//账号的信息一般都放在配置文件里面,用到的地方也很多

$info['appid'] = config('APP_APPID');

$info['partnerid'] = config('APP_MCHID');

$info['package'] = config('APP_PACKAGE');

$info['noncestr'] = $this->random_number();//生成随机数,下面有生成实例,统一下单接口需要

$info['timestamp'] = time();

$info['prepayid'] = $prepay_id;

$info['sign'] = self::_makeSign($info);//生成签名return $info;

$info就是客户端需要的信息啦

生成随机数实例//生成随机数

public function random_number($len=21,$format='ALL' ){

$is_abc = $is_numer = 0;

$password = $tmp ='';

switch($format){

case 'ALL':

$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; break;

case 'CHAR':

$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; break;

case 'NUMBER':

$chars='0123456789'; break;

default :

$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; break;

} // www.jb51.net

mt_srand((double)microtime()*1000000*getmypid()); while(strlen($password)

$tmp =substr($chars,(mt_rand()%strlen($chars)),1); if(($is_numer <> 1 && is_numeric($tmp) && $tmp >0 )|| $format == 'CHAR'){

$is_numer = 1;

} if(($is_abc <> 1 && preg_match('/[a-zA-Z]/',$tmp)) || $format == 'NUMBER'){

$is_abc = 1;

}

$password.= $tmp;

} if($is_numer <> 1 || $is_abc <> 1 || empty($password) ){

$password = $this->random_number($len,$format);

} return $password;

}

微信回调

支付结果通知 notify.php(这里的地址就是统一下单时填写的回调地址,微信已经封装好),文档下载地址

http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

其实这个页面最主要的代码就两行

[php] view plain copy$notify = new PayNotifyCallBack();

$notify->Handle(false);

其中大部分逻辑在 Handle 函数中处理 文件 WxPay.Notify.php

[php] view plain copyfinal public function Handle($needSign = true)

{

$msg = "OK";

//当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败

$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);

if($result == false){

$this->SetReturn_code("FAIL");

$this->SetReturn_msg($msg);

$this->ReplyNotify(false);

return;

} else {

//该分支在成功回调到NotifyCallBack方法,处理完成之后流程

$this->SetReturn_code("SUCCESS");

$this->SetReturn_msg("OK");

}

$this->ReplyNotify($needSign);

}

主要代码:

[php] view plain copy$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);

跟踪函数 notify 文件WxPay.Api.php

[php] view plain copypublic static function notify($callback, &$msg)

{

//获取通知的数据

$xml = $GLOBALS['HTTP_RAW_POST_DATA'];

//如果返回成功则验证签名

try {

$result = WxPayResults::Init($xml);

} catch (WxPayException $e){

$msg = $e->errorMessage();

return false;

}

return call_user_func($callback, $result);

}

通过 $GLOBALS[‘HTTP_RAW_POST_DATA’]; 获取同志数据 然后 Init 函数验证签名等。验签成功运行代码.

这里需要说明一下,php7本身不支持$GLOBALS[‘HTTP_RAW_POST_DATA’],需要下载一个插件,具体什么可自行百度,我想说的是可以用file_get_contents(‘php://input’),具体原因可参照下面的博客,写的很详细(https://my.oschina.net/jiec/blog/485359)

[php] view plain copyreturn call_user_func($callback, $result);

即调用了一个回调函数,NotifyCallBack() 函数并传递参数 $result 在NotifyCallBack函数中会调用我们重写的NotifyProcess()函数(此函数在notify.php 中被重写)

NotifyProcess() 判断也没有问题就会 设置返回 success的xml信息

[php] view plain copy$this->SetReturn_code("SUCCESS");

$this->SetReturn_msg("OK");

并最终调用函数 this−>ReplyNotify(this−>ReplyNotify(needSign); echo success的结果

函数ReplyNotify 需要修改一处代码:

[php] view plain copyfinal private function ReplyNotify($needSign = true)

{

//如果需要签名

if($needSign == true &&

$this->GetReturn_code($return_code) == "SUCCESS")

{

$this->SetSign();

}

WxpayApi::replyNotify($this->ToXml());

}

[php] view plain copy$this->GetReturn_code($return_code) == "SUCCESS")

改为

[php] view plain copy$this->GetReturn_code() == "SUCCESS")

即可。

然后是根据返回信息修改订单状态,主要就是,在什么地方修改,我是在notify.php里面新建了一个方法//修改订单状态

public function updateState($data){ if($data){

$order_sn = $data['out_trade_no'];\

$data = array();

$data['order_id'] = $order_id;

//修改订单状态(用curlpost方法请求至thinkphp目录下的Controller里面控制器里面的方法,修改状态)

$url = 'www.test.com';

header('content-type:text/html;charset=utf8');

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

curl_setopt($curl, CURLOPT_POST, true);

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

$result = curl_exec($curl);

curl_close($curl); if($result == 'success'){ return true;

}else{ return false;

}

}

}

然后在notify.php 的$notify = new PayNotifyCallBack();

$notify->Handle(false);

下面加上//接受参数,修改状态

$xml = file_get_contents("php://input");

$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);

$notify->updateState($data);

相关推荐:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Uni-app是一种跨平台的开发框架,可以方便地开发出适用于多个终端的应用程序,包括Web、iOS、Android等。在开发过程中,我们可以使用uni-app提供的API实现多种功能,比如调用微信支付。 首先,我们需要在应用程序内引入微信支付所需的SDK,在Uni-app中可以使用插件机制,自己开发一个插件或者使用已有的插件,如uni-wxpay等。然后,在APP内调用微信支付的流程如下: 1.在创建支付订单时,需要将订单信息传递给服务端,由服务端生成订单号、调用微信支付API生成预支付订单,并返回给APP。 2.APP拿到预支付订单后,调用微信SDK内置的API进行支付,主要包括支付参数的配置和支付的发起。 3.支付完成后,微信会回调我们在服务端注册的回调地址,服务端通过请求微信的API对支付结果进行核对,确认支付是否成功,并作出相应的处理。 需要注意的是,在调用微信支付API时需要在微信开放平台申请开发者账号,并完成相应的配置,包括设置支付回调地址、支付授权目录等等。 总之,通过调用微信支付API,我们可以为APP添加支付功能,实现线上商品购买、捐赠赞赏等功能。而在Uni-app中,使用插件机制可以更加方便快捷地完成这个流程。 ### 回答2: uni-app 是一个可以跨平台开发的框架,它支持开发微信小程序、支付宝小程序、H5 等多个平台。在 uni-app 中内调用微信支付可以实现用户在应用内进行支付,下面我将具体介绍 uni-app 中如何进行内调用微信支付。 1. 首先需要在应用中安装微信支付插件,打开 HBuilderX,选择菜单栏中的“插件市场”,搜索“微信支付”,选择安装。 2. 在应用中使用微信支付的页面中引入微信支付插件: ```javascript import $payment from "@/uni_modules/yk-payment/js_sdk/uni-payment.js"; // 引入插件 ``` 3. 在需要支付的位置,调用微信支付的方法: ```javascript uni.showLoading({ title: '加载中' }); $payment.weixinPay({ timeStamp: '1603388794', nonceStr: '5pnskrq5060pt2lljndzpta9hzqmxrsq', package: 'prepay_id=wx30163954528026d7bf482abf2becd37124', signType: 'MD5', paySign: '3ACA84580DD8C32D8478B4BBF3688A1D', success: function (res) { console.log('success:' + JSON.stringify(res)); }, fail: function (err) { console.log('fail:' + JSON.stringify(err)); }, complete: function (res) { uni.hideLoading(); } }); ``` 其中,微信支付需要提供以下参数: - timeStamp:时间戳,单位为秒 - nonceStr:随机字符串,不长于 32 位 - package:统一下单接口返回的 prepay_id,参考[微信支付开发文档](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1)中获取订单号 - signType:签名算法,目前支持 MD5 和 HMAC-SHA256 - paySign:签名,具体签名方式详见[微信支付开发文档](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1) 微信支付成功后会回调 success 回调函数,失败则回调 fail 回调函数。 4. 在微信支付后端接口中,需要根据微信支付返回的结果进行签名校验,确保订单的真实性。 综上所述,使用 uni-app 内调用微信支付步骤相对简单,只需安装微信支付插件,调用支付方法即可,但支付过程中需要注意时间戳、随机字符串、签名等参数的正确性,同时在后端接口中校验微信支付的签名以确保支付的真实性。 ### 回答3: Uni-app是一个跨平台开发框架,它可以让开发者一次编写代码,同时在多个平台上运行。微信支付是一个广为人知的移动支付平台,它可以提供便捷的支付服务。在实践中,我们可以使用Uni-app中的支付插件来在应用程序中调用微信支付。下面是如何实现Uni-app应用程序内调用微信支付: 1. 首先,安装支付插件在Uni-app开发环境中,可以通过npm安装。 2. 在支付插件内部,我们需要引用微信支付的API,以便在我们的应用程序中调用这些API来实现支付。这些API包括支付API、查询订单API、退款API等等。 3. 接下来,我们需要在我们的代码中调用支付API,这个API用于请求加载微信支付。当用户点击订单支付按钮时,我们可以在后台发送一个请求,请求加载微信支付页面和所需的支付参数。 4. 在向微信支付发送请求后,我们需要接收来自微信支付的响应,然后将结果传递给我们的应用程序。通常,微信支付会将支付结果返回给我们的后台服务器,然后我们可以将结果传递给我们的应用程序。我们可以使用Uni-app的API来轮询服务器以获取结果。 5. 最后,我们需要在我们的应用程序中向用户显示支付结果。如果支付成功,我们可以向用户显示订单确认信息。如果支付失败,我们可以向用户显示错误信息。 总之,Uni-app应用程序的开发者可以使用插件实现在应用程序中调用微信支付。开发者需要在插件内部引用微信支付API,然后在代码中调用它们来实现支付。最后,我们需要接收来自微信支付的响应,并在我们的应用程序中向用户显示支付结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值