微信JSAPI支付,统一下单接口

今天小编给大家分享一下微信支付的统一下单接口,其实微信官网上也有SDK和DEMO下载了,但是不太好理解,小编就自己整理一份容易理解的代码,看不懂官方的,就来看看小编这份吧,哈哈~

新建一个类WxPayJsApi.php:

// +----------------------------------------------------------------------

// | 微信JSAPI支付

// +----------------------------------------------------------------------

// | Copyright (c) 2017 http://www.lrfun.com All rights reserved.

// +----------------------------------------------------------------------

// | Author: lrfun

// +----------------------------------------------------------------------

// | Date: 2017-06-12

// +----------------------------------------------------------------------

Class WxPayJsApi{

protected $appid; protected $mchid;

protected $keys;

function __construct(){

$this->appid = "xxx";

$this->mchid = "xxx";

$this->keys = "xxx";

}

public function unifiedorder($data){

$parameters = array();

$parameters['appid'] = $this->appid;

$parameters['mch_id'] = $this->mchid;

$parameters['nonce_str'] = $this->getNonceStr();

$parameters['body'] = $data['body'];

$parameters['out_trade_no'] = $this->mchid . date("YmdHis");

$parameters['total_fee'] = $data['total_fee'];

$parameters['spbill_create_ip'] = $_SERVER["REMOTE_ADDR"];

$parameters['notify_url'] = 'http://www.lrfun.com/wxPayCallback.php';

$parameters['trade_type'] = 'JSAPI';

$parameters['openid'] = $data['openid'];//微信用户的openid(前面有发表过如何获取openid的文章,这里不多说了)

$parameters['time_start'] = date("YmdHis");

$parameters['time_expire'] = date("YmdHis", time() + 3600);

$parameters['attach'] = $data['orderId'];//订单ID,用于支付成功后,更新订单状态

$parameters['sign'] = $this->getSign($parameters);

$queryXml = $this->arrayToXml($parameters);

$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';

$returnData = $this->httpRequest($url, $queryXml);

$result = $this->xmlToArray($returnData);

$jsApiData = $this->getJsApiParameters($result);

return $jsApiData;

}

/***

* 微信支付生成签名

* @parameters 签名数据

* @return 签名字符串

**/

public function getSign($parameters){

ksort($parameters);

$parametersUrl = urldecode(http_build_query($parameters)) .'&key='. $this->keys;

$sign = strtoupper(md5($parametersUrl));

return $sign;

}

/***

* 数组转xml

* @arr 数组

* @return xml

**/

private function arrayToXml($arr){

if(!is_array($arr) || count($arr) <= 0){

exit("数组数据异常!");

}

$xml = "";

foreach ($arr as $key=>$val){

if (is_numeric($val)){

$xml.="".$val."".$key.">";

}else{

$xml.="".$key.">";

}

}

$xml .= "";

return $xml;

}

/***

* POST或GET请求

* @url 请求url

* @data POST数据

* @return

**/

private function httpRequest($url, $data = ""){

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

if(!empty($data)){ //判断是否为POST请求

curl_setopt($curl, CURLOPT_POST, 1);

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

}

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$output = curl_exec($curl);

curl_close($curl);

return $output;

}

/***

* XML转数组

* @url XML

* @return 数组

**/

private function xmlToArray($xml){

if(!$xml){

echo "xml数据异常!";

exit;

}

libxml_disable_entity_loader(true);

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

return $arr;

}

/***

* 获取jsapi支付参数

* @data 请求微信返回的数据

* @return JSON

**/

private function getJsApiParameters($data){

$timeStamp = time();

$jsapi["appId"] = $this->appid;

$jsapi["nonceStr"] = $this->getNonceStr();

$jsapi["timeStamp"] = "$timeStamp";

$jsapi["signType"] = "MD5";

$jsapi["package"] = "prepay_id=".$data["prepay_id"];

$jsapi["paySign"] = $this->getSign($jsapi);

$jsApiParameters = json_encode($jsapi);

return $jsApiParameters;

}

/***

* 支付成功回调函数

**/

public function callback(){

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

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

$callbackSign = $data['sign'];

unset($data['sign']);

$sign = $this->getSign($data);

if($sign == $callbackSign){

//这里更新你的订单状态

//根据$data['attach']获取订单信息,更新订单状态

$returnXml = '';

echo returnXml;

}

}

/***

* 生成随机数

* @length 随机字符串长度(默认32位)

* @return

**/

private function getNonceStr($length = 32) {

$chars = "abcdefghijklmnopqrstuvwxyz0123456789";

$str = "";

for ( $i = 0; $i < $length; $i++ ) {

$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);

}

return $str;

}

}

新建index.php,调用代码:

require_once('WxPay.JsApi.php');

$wxPayJsApi = new WxPayJsApi();

$data = array('body'=>'test', 'total_fee'=>1, 'openid'=>'ocjhxwYwEXlagni-n21fdNArvYWk', 'orderId'=>'168');

$parameters = $wxPayJsApi->unifiedorder($data);

?>

微信JSAPI支付样例

//调用微信JS api 支付

function jsApiCall()

{

WeixinJSBridge.invoke(

'getBrandWCPayRequest',

<?php echo $parameters; ?>,

function(res){

WeixinJSBridge.log(res.err_msg);

alert(res.err_code+res.err_desc+res.err_msg);

}

);

}

function callpay()

{

if (typeof WeixinJSBridge == "undefined"){

if( document.addEventListener ){

document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);

}else if (document.attachEvent){

document.attachEvent('WeixinJSBridgeReady', jsApiCall);

document.attachEvent('onWeixinJSBridgeReady', jsApiCall);

}

}else{

jsApiCall();

}

}

该笔订单支付金额为1分钱

立即支付

新建回调文件callback.php:

require_once('WxPay.JsApi.php');

$wxPayJsApi = new WxPayJsApi();

$wxPayJsApi->callback();

上一篇:PayPal支付教程

下一篇:微信支付之Native扫码支付 模式二

php 微信统一下单接口,微信JSAPI支付,统一下单接口相关推荐

  1. 微信小程序中使用JSAPI支付

    微信小程序中使用JSAPI支付 在微信小程序中使用微信支付api[wx.requestPayment]需要传递以下字段 如何获取支付所需要的值 在微信小程序中使用微信支付api[wx.requestP ...

  2. 微信小程序netcore后台api支付结果通知接口的坑

    终于搞定回调通知了,这里总结下几个暗坑 1.回调通知一定是post接口,且可以直接访问 2.需要解析回调的HttpContext内容才能知道结果 3.收到信息一定要进行验证判断是否来自于微信渠道 4. ...

  3. 微信公众号h5使用jsapi支付

    准备工作 准备好公众号及支付商户号相关的:appid,商户号id,appsecret,apikey(支付密钥v2),下载好api支付证书路径,公众号中配置好业务域名(前端与域名). 域名穿透内网 我使 ...

  4. java 移动支付接口开发,移动支付平台间接口报文解析技术核心架构实现、及平台交易处理项目全程实录教程...

    课程介绍:本课程抛开理论.以项目为驱动,适用于初次接触报文收发.组装解析以及交易分发的同学或开发人员.从报文规范的阅读.需求提炼.到架构实现,做到由浅入深的讲解.涉及到的内容或技术有:使用JAXB转换 ...

  5. php ci框架 微信公众号 JSAPI支付

    打开微信商户平台的开发文档,下载php版的SDK与Demo 准备好参数: 1:微信公众号AppID, 2:微信公众号AppSecret, 微信公众平台,商户平台添加好项目授权地址等内容 首先获取用户o ...

  6. 微信浏览器中的微信支付,JSAPI支付,开发流程、常见问题

    微信支付有两种使用场景,一种是可以在微信之外的浏览器(如UC浏览器.手机自带浏览器等)中使用,在微信外部唤醒微信进行支付:还有一种是在微信自带内置浏览器中使用,比如微信公众号里边的支付.给客户在微信上 ...

  7. 微信jsapi支付获取code_【微信支付】JSAPI支付开发者文档

    一.概述 为保证商户接入质量,提升交易安全及用户体验,微信支付的合作服务商在正式上线交易前,必须先根据本文指引完成验收.验收完成后,服务商在验收公众平台(微信号:WXPayAssist)提交验收通过申 ...

  8. APP 对接 java 微信支付统一下单接口

    首先插入微信支付的时序图 统一下单时候的请求对象,需要把这个转为xml 文件格式所以需要在pom.xml 文件中导入 .和微信支付的sdk <dependency> <groupId ...

  9. php微信统一公众号支付接口,微信公众号支付怎么实现统一下单接口

    微信公众号支付怎么实现统一下单接口 发布时间:2021-03-12 09:44:45 来源:亿速云 阅读:89 作者:小新 这篇文章将为大家详细讲解有关微信公众号支付怎么实现统一下单接口,小编觉得挺实 ...

最新文章

  1. 【内存泄露】Memory Leaks 内存优化
  2. 飞鸽传书找不到其他人的问题
  3. MiniGUI+qvfb+Eclipse完成嵌入式系统图形开发(开发环境的搭建)
  4. Ajax 文件上传之PHP心得
  5. 每天一点正则表达式复习(一)
  6. ​云原生:重新定义云时代的技术标准 | 凌云时刻
  7. hashmap containsvalue时间复杂度_恕我直言,你真的了解HashMap吗?
  8. getTickCount-opencv中计时与帧率计算的函数
  9. 如何解决同花顺软件打开时,出现 “无法与服务器建立连接” 的问题
  10. 你是否也陷入了《能力陷阱》?
  11. python3 print和format函数
  12. 智能客服 | 5款绝佳客户服务聊天机器人推荐
  13. Oracle SQL Developer使用dbms_output.put_line显示输出
  14. 【职业经验】三年数据沉淀!2020 年度测试行业问卷调查结果火热出炉!
  15. 转载 在心底举行的默哀仪式
  16. ESP8266EX芯片文档
  17. MetaMask轻钱包教程 修心手把手带你玩小狐狸 钱包小白必备非原创
  18. 杭州计算机中级职称评级流程,杭州本地中级工程师****流程
  19. 一个程序员的局域网聊天
  20. 【探花交友DAY 09】最近访客和FastDFS实现小视频功能

热门文章

  1. 【Y忍冬草】获取路径、打开文件图像等
  2. [漏洞挖掘]peach中配置pit文件—从入门到入狱系列
  3. oracle无法启动netmgr,linux没法启动netmgr
  4. php计算指定日期之间的天数,php计算任意两个日期之间的天数
  5. 毕业设计(论文)排版要求、时间安排、解决方案与建议
  6. Gym - 100851F Froggy Ford
  7. flex布局——宝藏游戏FlexboxFroggy
  8. ijkplayer初始化流程
  9. TENER: Adapting Transformer Encoder for Named Entity Recognition
  10. Hyperledger Fabric 2.0 官方文档中文版 第5章 开发应用程序