微信支付怎么调用 php+uniapp

1 篇文章 0 订阅
1 篇文章 0 订阅
步骤一:准备工作

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);
					}
				});

写的比较乱直接复制粘贴使用就可以,要是觉得有用有对你帮助记得关注点赞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值