php,tp5 微信小程序支付v2
注意:本文主要讲关于php后端的问题
一.配置小程序相关工作 (v2文档)
1.整理小程序引用文件目录
下面是我自己进行的配置。
使用了tp5.2的框架,下载SDK(这个虽然是扫码支付的demo,下载之后你会看见,这几种支付,它都有),在extend文件夹下新建wxpay文件夹,将如下需要的文件,放到wxpay文件夹下。如图
2.修改配置文件
修改WxPay.Config.php配置文件,添加支付appid和商户号,如图:
二.统一下单接口
1.下单获取prepay_id
统一下单接口文档链接(注意:接口文档最好熟读几遍,遇到问题,不要慌,先看一下文档,自己阅读后你会发现,有些问题,可能只是大小写的问题)
require_once EXTEND_PATH.'/wxpay/WxPay.Data.php';//引入微信支付
require_once EXTEND_PATH.'/wxpay/WxPay.Config.php';//配置
require_once EXTEND_PATH.'/wxpay/WxPay.Api.php';
$wxPayUnifiedOrder = new \WxPayUnifiedOrder();
$wxPayUnifiedOrder->SetBody($goodName);//商品描述
$wxPayUnifiedOrder->SetOut_trade_no($orderNumber);//商户订单号
$wxPayUnifiedOrder->SetTotal_fee($orderMoney);//支付金额,整数,最小单位是分
$wxPayUnifiedOrder->SetFee_type('CNY');
$wxPayUnifiedOrder->SetTime_start(date("YmdHis",$time));//交易起始时间
$wxPayUnifiedOrder->SetTime_expire(date("YmdHis",$time 1800));//交易结束时间,30分钟
$wxPayUnifiedOrder->SetNotify_url($callBackUrl);//这里写你的回调地址
$wxPayUnifiedOrder->SetTrade_type("JSAPI");//交易类型
$wxPayUnifiedOrder->SetProduct_id($id);//商品id
$wxPayUnifiedOrder->SetOpenid($openId']);//open_id,我这是前端传给我的
$config = new \WxPayConfig();
$result = \WxPayApi::unifiedOrder($config, $wxPayUnifiedOrder);
unifiedOrder这个方法是sdk自带的,直接引用即可,返回的结果也不用特殊处理,直接返回数组形式。
这里最好把返回值记录一下,看一下结果,方便开发。
2.判断返回值,并返回给小程序端支付的参数
接着1的代码,判断其返回状态
if(isset($result['return_code'])&&isset($result['result_code'])&&$result['result_code']=='SUCCESS'&&$result['return_code']=='SUCCESS'){
$prepayId = $result['prepay_id'];
$newData = [
'appId'=>$config->GetAppId,//这里需要注意,前面的参数名称一定要i这么大写,否则小程序会提示验证签名失败
'nonceStr'=>$result["nonce_str"],// 随机32位字符串
'package'=>'prepay_id='.$prepayId,
'signType'=>$config->GetSignType(),//在WxPay.Config.php文件里能看见对应的配置
'timeStamp'=>(string)time()
];
$string = '';
foreach ($newData as $key=>$value){
if(!$value) continue;
if($string) {
$string .= '&'.$key."=".$value;
}else {
$string = $key."=".$value;
}
}
$string = $string . "&key=".$config->GetKey();
$string = hash_hmac("sha256",$string ,$config->GetKey());//生成签名
$newData['pay_sign'] = strtoupper($string);
$newData['signType'] = $config->GetSignType();
unset($newData['app_id']);//保密处理,不在接口端返回app_id
}
直接组成小程序参数,返回给前端
(在返回小程序段之前,会将当前的订单信息,保存到数据库中,这里就不多写了。)
三.查询订单状态
1.在数据里面查询订单状态
在数据里面查询订单状态,以及订单的过期时间。如果订单已经过期了,或者订单不存在,要给前端返回对应的状态。(这里我偷懒了,不写了)
2.根据订单号,查询订单状态
require_once EXTEND_PATH.'/wxpay/WxPay.Data.php';//引入微信支付
require_once EXTEND_PATH.'/wxpay/WxPay.Config.php';//配置
require_once EXTEND_PATH.'/wxpay/WxPay.Api.php';
$config = new \WxPayConfig();
$input = new \WxPayOrderQuery();
$input->SetOut_trade_no($outTradeNo);//订单编号
$result = \WxPayApi::orderQuery($config, $input);
if(isset($result['trade_state'])&&$result['trade_state']=='SUCCESS'){
return ['code'=>'SUCCESS'];
}
当状态是成功时,返回前端,前端进行页面处理。
四.回调处理
/**
* 回调接口
*/
public function notify(){
try{
//获取通知的数据
$resultData = file_get_contents("php://input");
$requestHead = request()->header();
/**记录一下回调内容,并保存日志**/
$this->saveLog($fileName, $resultData );
if (empty($resultData)) {
# 如果没有数据,直接返回失败
throw new Exception('回调数据为空');
}
$jsonxml = json_encode(simplexml_load_string($resultData, 'SimpleXMLElement', LIBXML_NOCDATA));
$result = json_decode($jsonxml, true);
if (empty($result) ||$result['return_code'] != 'SUCCESS' || $result['result_code'] != 'SUCCESS') {
throw new Exception('支付失败:'.$resultData);
}
$tradeNom = $result['out_trade_no']; //商户自定义订单号
$transactionId = $result['transaction_id']; //微信交易单号
/**
*处理逻辑
*更新订单状态
*这里需要注意,回调接口会重复调用,需要判断一下订单状态,避免重复更新。
**/
return true;
}catch (Exception $exception){
//记录错误日志
$this->saveLog($fileName, $exception->getMessage());
return false;
}
}
这里需要注意,回调接口会重复调用,需要判断一下订单状态,避免重复更新
五.总结
做的时候,觉得很复杂,做完了之后,发现也没有那么复杂。有什么不懂的,就多读几遍文档,文档很重要。
(这是自己的一个记录,若有不足,希望指出。(* ̄︶ ̄)
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfegbg
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01