步骤一:准备工作
1. **微信商户平台注册** :确保你已经注册了微信商户平台账号,并且已经开通了微信支付功能。
2. **获取 API 密钥和商户号** :登录微信商户平台获取商户号(mch_id)和 API 密钥(key)。
步骤二:编写 PHP 代码
仔细看这个这个代码可以同用 app支付,h5支付,微信小程序支付
<?php
// 设置统一下单API地址
$unifiedOrderUrl = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
// 替换成你的商户号
$mchId = 'YOUR_MCH_ID';
// 替换成你的商户API密钥
$apiKey = 'YOUR_API_KEY';
// 准备订单数据
$params = array(
'appid' => '你的微信应用ID',
'mch_id' => $mchId,
'nonce_str' => uniqid(), // 随机字符串
'body' => '测试商品', // 商品描述
'out_trade_no' => 'ORDER' . time(), // 商户订单号
'total_fee' => 1, // 订单金额,单位为分,这里为1分钱
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], // 客户端IP
'notify_url' => 'http://example.com/notify.php', // 异步通知地址
'trade_type' => 'NATIVE' // 扫码支付类型 JSAPI(小程序支付/公众号支付) APP(app里支付)
);
// 签名
$params['sign'] = makeSign($params, $apiKey);
// 数组转换为XML
$xmlData = arrayToXml($params);
// 发送请求并获取结果
$responseXml = postXmlCurl($xmlData, $unifiedOrderUrl);
// 处理返回结果
$response = xmlToArray($responseXml);
// 输出二维码链接
if ($response['return_code'] == 'SUCCESS' && $response['result_code'] == 'SUCCESS') {
$codeUrl = $response['code_url'];
echo '<img src="http://paysdk.weixin.qq.com/example/qrcode.php?data=' . urlencode($codeUrl) . '" style="width:150px;height:150px;"/>';
} else {
echo '下单失败:' . $response['return_msg'];
}
// 生成签名
function makeSign($params, $apiKey) {
// 去除数组中的空值和签名字段
unset($params['sign']);
foreach ($params as $key => $value) {
if ($value == '' || $key == 'sign') {
unset($params[$key]);
}
}
// 按照参数名ASCII码从小到大排序
ksort($params);
// 使用URL键值对的格式拼接成字符串
$string = http_build_query($params) . '&key=' . $apiKey;
// MD5签名并转换为大写,最终得到签名
return strtoupper(md5($string));
}
// 数组转换为XML
function arrayToXml($params) {
$xml = '<xml>';
foreach ($params as $key => $val) {
$xml .= '<' . $key . '>' . $val . '</' . $key . '>';
}
$xml .= '</xml>';
return $xml;
}
// 发送XML数据并接收返回结果
function postXmlCurl($xml, $url, $second = 30) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
// XML转换为数组
function xmlToArray($xml) {
// 禁止引用外部xml实体
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$result = json_decode(json_encode($xmlstring), true);
return $result;
}
?>
正确的返回格式
步骤三:编写 Uniapp 代码 微信小程序内支付
uni.requestPayment({
provider: 'wxpay',
timeStamp: re.data.ok.timestamp, // 后端返回的支付参数中的timeStamp
nonceStr: re.data.ok.nonceStr, // 后端返回的支付参数中的nonceStr
package: re.data.ok.package, // 后端返回的支付参数中的package
signType: 'MD5', // 签名方式,默认为MD5,微信推荐HMAC-SHA256
paySign: re.data.ok.paySign, // 后端返回的支付参数中的paySign
success: function(res) {
console.log('支付成功', res);
const that = this;
that.$emit('ok', '200');
that.updateinfo(re.data.user);
}.bind(this), // 绑定正确的this上下文
fail: function(err) {
console.log('支付失败', err);// 处理支付失败后的逻辑
}
});
步骤四:编写 Uniapp 代码 微信公众号//微信内H5支付
WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId": re.data.appId, //公众号ID,由商户传入
"timeStamp": re.data.timestamp, //时间戳,自1970年以来的秒数
"nonceStr": re.data.nonceStr, //随机串
"package": re.data.package,
"signType": re.data.signType, //微信签名方式:
"paySign": re.data.paySign
},
function(rs) {
this.payres = rs;
if (rs.err_msg == "get_brand_wcpay_request:ok") {
// 支付成功后的事件
this.json = rs.err_msg;
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
} else {
// 支付失败或者取消支付的事件
}
});
步骤五:编写 Uniapp 代码 APP里使用微信支付
首先要注册腾讯开放平台并交300元认证账号,要注册应用
示例
uniapp 源码 示例
const that = this;
var paydata = re.data.ok;
var paypay = {
"appid": paydata.appid, // 微信开放平台 - 应用 - AppId,注意和微信小程序、公众号 AppId 可能不一致
"noncestr": paydata.noncestr, // 随机字符串
"package": paydata.package, // 固定值
"partnerid": paydata.partnerid, // 微信支付商户号
"prepayid": paydata.prepayid, // 统一下单订单号
"timestamp": paydata.timestamp, // 时间戳(单位:秒)
"sign": paydata.sign, // 签名,这里用的 MD5/RSA 签名
};
uni.getProvider({
service: 'payment',
success: function(res) {
if (~res.provider.indexOf('wxpay')) {
uni.requestPayment({
"provider": "wxpay", //固定值为"wxpay"
"orderInfo": paypay,
success: function(res) {
console.log(res);
that.updateinfo(re.data.user);
},
fail(res) {
console.error('requestPayment', res);
}
})
}
},
fail(res) {
console.error('getProvider', res);
}
});
写的比较乱直接复制粘贴使用就可以,要是觉得有用有对你帮助记得关注点赞