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

微信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扫码支付 模式二

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 微信小程序统一下单后台代码可以使用微信支付提供的API进行开发。以下是一个示例代码,仅供参考: ```php <?php // 导入SDK require_once "WxPayApi.php"; require_once "WxPayUnifiedOrder.php"; require_once "WxPayConfig.php"; // 设置参数 $input = new WxPayUnifiedOrder(); $input->SetBody("test"); // 商品描述 $input->SetAttach("test"); // 附加数据 $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis")); // 商户订单号 $input->SetTotal_fee("1"); // 标价金额,单位为分 $input->SetTime_start(date("YmdHis")); // 订单生成时间 $input->SetTime_expire(date("YmdHis", time() + 600)); // 订单失效时间 $input->SetNotify_url("http://www.example.com/wxpay/notify.php"); // 接收微信支付异步通知回调地址 $input->SetTrade_type("JSAPI"); // 交易类型 $input->SetOpenid($openId); // 用户标识 // 统一下单 $order = WxPayApi::unifiedOrder($input); // 处理返回结果 if($order["return_code"] == "SUCCESS" && $order["result_code"] == "SUCCESS"){ $jsApiParams = $tools->GetJsApiParameters($order); // 将jsApiParams返回给前端,用于调起微信支付 }else{ // 统一下单失败 echo $order["return_msg"]; } ``` 需要注意的是,该代码中的`WxPayConfig`类需要根据自己的实际情况进行配置。此外,还需要导入`WxPayApi.php`、`WxPayUnifiedOrder.php`和`WxPayConfig.php`三个文件,这些文件可以从微信支付官方网站下载。 ### 回答2: 微信小程序统一下单是指在用户点击支付按钮后,将用户的支付请求统一提交到后台进行处理,后台代码的作用是验证用户请求的合法性,并生成预支付订单信息,最后返回给小程序供用户进行支付操作。 在后台代码中,首先需要验证用户请求的合法性,包括校验用户传递的参数是否完整、参数的格式是否正确等。然后,通过调用微信支付接口生成预支付订单信息,包括订单号、支付金额、商品描述等,并将这些信息保存到数据库中,以便后续查询和验证。生成预支付订单信息时,需要根据用户所选的支付方式来调用相应的支付接口。 接下来,在后台代码中要生成一个包含预支付订单信息的参数对象,用于向小程序返回支付页面的数据。这个参数对象一般包括小程序的AppID、时间戳、随机字符串、签名等信息,其中签名是根据预支付订单信息和微信支付的配置参数进行计算得到的,用于确保数据的完整性和安全性。 最后,后台代码要将生成的参数对象返回给小程序,小程序再根据这些参数使用微信支付的API进行支付操作。小程序端会获取到预支付订单信息和支付配置参数,然后调用微信支付接口进行支付,在支付过程中,用户需要输入支付密码或进行指纹验证等操作来完成支付。 总的来说,微信小程序统一下单后台代码的功能是验证用户请求的合法性,生成预支付订单信息,并返回给小程序,以供用户进行支付操作。这样可以确保用户的支付请求安全可靠,并实现用户支付的流程控制。 ### 回答3: 微信小程序统一下单后台代码通常分为前端部分和后端部分。 前端部分主要是用户在小程序中选择商品,填写订单信息后,将订单信息发送到后台进行处理。常用的前端代码如下: 1. 用户在小程序中选择商品并填写订单信息,点击提交订单按钮。 2. 前端通过调用微信提供的API,将订单信息发送到后台。 3. 前端接收到后台的响应,判断是否下单成功。 4. 如果下单成功,则显示支付界面,引导用户进行支付。 后端部分主要是接收前端发送的订单信息,并使用微信支付接口进行统一下单的处理。常用的后端代码如下: 1. 后端接收到前端发送的订单信息,包括商品信息、价格、数量等。 2. 后端调用微信支付统一下单接口,将订单信息发送给微信支付服务器。 3. 微信支付服务器返回给后端一个预支付交易会话标识prepay_id。 4. 后端将prepay_id返回给前端,作为用户进行支付的凭证。 5. 用户在前端界面点击支付后,前端调用微信支付API,将prepay_id发送给微信支付服务器。 6. 微信支付服务器根据prepay_id进行支付的相关处理,返回支付结果给前端。 以上是一个简单的微信小程序统一下单后台代码的流程示例。在实际开发中,还需根据业务需求对代码进行定制,如处理订单状态、生成订单号、计算总金额等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值