公众号中的微信支付需要通过js来实现。微信js-sdk是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。
1)引入JS脚本文件
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
系统介绍 45°C 商城系统,以 Thinkphp5.0 + Uniapp + Layui2.9 + Vue 为技术基石,精心打造出的全新 MINI 商城应用。其功能覆盖全面,无论是 PC 商城、H5 商城,还是公众号商城、微信小程序以及抖音小程序的制作都能完美胜任。采用标准系统结合插件模式开发,用户能够极为便捷地定制专属的个性模块。整个系统,从程序设计到 UI 呈现,都秉持着一贯的小而美理念。程
0
2)通过config接口注入权限验证配置
<script>
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
});
</script>appId就是应用ID,wx打头的那串字符,timestamp在php中就用time()获取,而nonceStr就用uniqid()获取,而signature根据特定算法获取。
protected function getJsapiConfig()
{
$weixin = new Weixin();
$ticketMongo = new WeixinJsapiTicket();
$data = [
'appId' => $weixin->getAppId(),
'noncestr' => uniqid(),
'jsapi_ticket' => $ticketMongo->getJsapiTicket(),
'timestamp' => time()
];
//拼装原始待签名串
$src = [
'noncestr=' . $data['noncestr'],
'jsapi_ticket=' . $data['jsapi_ticket'],
'timestamp=' . $data['timestamp']
];
sort($src);
$data['signature'] = sha1(implode('&', $src));
return $data;
}这里说明下“jsapi_ticket”,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于有时间限制,而且获取jsapi_ticket的api调用次数非常有限,所以我会将获取到的jsapi_ticket保存到MongoDB中。
/**
* 通过access_token获取jsapi_ticket
* @param $access_token
* @return string | null
*/
public function getJsapiTicket($access_token)
{
$url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket';
$param = [
'access_token' => $access_token,
'type' => 'jsapi'
];
$res = $this->request($url, $param);
$result = json_decode($res, true);
if (isset($result['errcode']) && $result['errcode'] == 0 && isset($result['ticket'])) {
return $result;
}
return null;
}
3)通过ready接口处理成功验证
1)prepay_id是根据本地生成的订单号等获取的,订单号每次请求的得不一样,不然会报错的
2)nonceStr就用md5(uniqid('baiaimama'))获取
3)signType使用MD5
4)paySign根据代码的参数,排序后拼接获得。
wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
});/**
* 生成jsapi需要调用的参数
*/
public function getJsapiParam(){
$param = [
'appId' => $this->APPID,
'timeStamp' => time(),
'nonceStr' => md5(uniqid('baiaimama')),
'package' => 'prepay_id='.$this->param['prepay_id'],
'signType' => 'MD5'
];
$str = [];
foreach($param as $k=>$v){
if(!empty($v)){
$str[] = "{$k}={$v}";
}
}
sort($str);
$unsignKey = join('&', $str).'&key='.$this->KEY;
$sign = strtoupper(md5($unsignKey));
$param['paySign'] = $sign;
return $param;
}
异步回调中做些修改订单状态、发送短信,推送消息等操作。
/**
* 微信支付异步回调API
* 微信支付成功,会收到异步回调
*/
public function actionWxpay()
{
$weixinPay = new WeixinPay();
$weixin = new Weixin();
$xml = file_get_contents('php://input');
$msg = $weixin->parseMsg($xml);
//记录微信推送日志
$notifyMongo = new WeixinPayNotify();
$notifyMongo->logPayNotify($xml);
if(!$msg || !is_object($msg)){
$weixinPay->notifyXml('FAIL', '通知不合法');
}
if(!isset($msg->return_code) || $msg->return_code != 'SUCCESS'){
$weixinPay->notifyXml('FAIL', '通信失败');
}
if(!isset($msg->result_code) || $msg->result_code != "SUCCESS"){
$weixinPay->notifyXml('FAIL', '交易失败');
}
//签名验证失败
if(!$weixinPay->checkSign($msg)){
$weixinPay->notifyXml('FAIL', '签名验证失败');
}
//$notifyMongo->add($msg);
//流程走到这里说明已经支付成功了,这里无需更新订单逻辑
$userOrder = new UserOrder();
//记录微信订单号
$userOrder->pay($msg->out_trade_no, $msg->transaction_id);
}
demo下载:
github地址:https://github.com/pwstrick/weixin_demo
CSDN地址:http://download.csdn.net/detail/loneleaf1/9045731
更多微信公众平台开发微信支付 相关文章请关注PHP中文网!
微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号