微信小程序基于PHP微信支付“签名错误”填坑

第一次写,主要给自己看,记录一下
利用微信开发者工具开发商城类微信小程序,开发微信支付必不可少,但微信支付api开发文档说明压根看不懂,自己摸索,运行报错找不到错误代码解决方法
先说说我的开发流程吧
小程序前端——小程序js网络请求php后台——后台接收小程序传回数据——微信支付官网下载sdk包——微信商户配置——sdk配置——签名验证获取prepay_id——传回前端调用微信支付api——完成

想要完成微信支付就必须获取由微信系统后台传回的prepay_id,就必须要生成正确的签名

微信官方文档说明

  1. 查看小程序appid,商户号,商户key,小程序密钥是否正确匹配
  2. 检查签名拼接是否按要求拼接,用签名验证工具验证一下https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1
  3. 修改商户key,原封不动的改一次 key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置
  4. 检查商户是否对支付目录授权,必须授权才可以,然后商户对appid授权会生成一个商户号对应
    我就是败在了第4点上,检查了一遍又一遍发现没有授权目录与appid,因为商户号是可变动的,一定要与appid匹配我就是败在了第4点上,检查了一遍又一遍发现没有授权目录与appid,因为商户号是可变动的,一定要与appid匹配

签名算法

<?php
/*
 * 小程序微信支付
 */
class WeixinPay {
   
    protected $appid;
    protected $mch_id;
    protected $key;
    protected $openid;
    protected $out_trade_no;
    protected $body;
    protected $total_fee;
            function __construct($appid, $openid, $mch_id, $key,$out_trade_no,$body,$total_fee) {
   
        $this->appid = $appid;
        $this->openid = $openid;
        $this->mch_id = $mch_id;
        $this->key = $key;
        $this->out_trade_no = $out_trade_no;
        $this->body = $body;
        $this->total_fee = $total_fee;
    }


    public function pay() {
   
        //统一下单接口
        $return = $this->weixinapp();
        return $return;
    }


    //统一下单接口
    private function unifiedorder() {
   
        $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
		$jjc=$this->createNoncestr();
        $parameters = array(
            'appid' => $this->appid,
            'body' => $this->body,
            'mch_id' => $this->mch_id,
            'nonce_str' => $jjc,
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序支付的流程主要包括以下几个步骤: 1. 获取用户的 openid:用户在小程序中完成登录授权后,可以通过调用微信的登录接口获取用户的 openid。 2. 生成预支付订单:在服务器端使用统一下单接口生成预支付订单,需要传入以下参数:appid(小程序的appid)、mch_id(商户号)、nonce_str(随机字符串)、body(商品描述)、out_trade_no(商户订单号)、total_fee(订单总金额)、spbill_create_ip(终端IP)、notify_url(异步通知地址)等。 3. 签名并返回支付参数:根据获取到的预支付订单信息,使用商户密钥进行签名,然后将签名和其他支付参数返回给小程序前端。 4. 调用支付接口:在小程序前端调用微信支付接口,传入支付参数,发起支付求。 5. 支付结果通知:用户完成支付后,微信会向预先设置的异步通知地址发送支付结果通知。服务器端接收到通知后,验证签名并处理支付结果。 6. 返回支付结果:处理完支付结果后,服务器端需要返回给小程序前端相应的支付结果信息。 在 PHP 中,你可以使用 cURL 或者第三方的微信支付 SDK 来完成上述步骤。示例代码如下: ```php <?php // 生成预支付订单 function createPrepayOrder($params) { $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; // 设置求参数 $data = array( 'appid' => $params['appid'], 'mch_id' => $params['mch_id'], 'nonce_str' => md5(uniqid()), 'body' => $params['body'], 'out_trade_no' => $params['out_trade_no'], 'total_fee' => $params['total_fee'], 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], 'notify_url' => $params['notify_url'], 'trade_type' => 'JSAPI', 'openid' => $params['openid'] ); // 生成签名 $sign = generateSign($data, $params['key']); $data['sign'] = $sign; // 将参数转为 XML 格式 $xml = arrayToXml($data); // 发送求 $response = sendRequest($url, $xml); // 解析响应结果 $result = parseResponse($response); return $result; } // 生成签名 function generateSign($data, $key) { ksort($data); $string = ''; foreach ($data as $k => $v) { if ($v != '' && !is_array($v) && $k != 'sign') { $string .= $k . '=' . $v . '&'; } } $string .= 'key=' . $key; return strtoupper(md5($string)); } // 将数组转为 XML 格式 function arrayToXml($data) { $xml = '<xml>'; foreach ($data as $key => $value) { if (is_numeric($value)) { $xml .= '<' . $key . '>' . $value . '</' . $key . '>'; } else { $xml .= '<' . $key . '><![CDATA[' . $value . ']]></' . $key . '>'; } } $xml .= '</xml>'; return $xml; } // 发送求 function sendRequest($url, $data) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); curl_close($ch); return $response; } // 解析响应结果 function parseResponse($xml) { $result = array(); $data = simplexml_load_string($xml); foreach ($data as $key => $value) { $result[$key] = strval($value); } return $result; } // 示例调用 $params = array( 'appid' => 'your_appid', 'mch_id' => 'your_mch_id', 'key' => 'your_key', 'openid' => 'user_openid', 'body' => '商品描述', 'out_trade_no' => '商户订单号', 'total_fee' => 100, 'notify_url' => '异步通知地址' ); $result = createPrepayOrder($params); print_r($result); ?> ``` 以上代码为示例代码,具体参数和配置根据实际情况进行修改。同时,你也可以使用微信提供的官方 SDK 来简化支付流程,如 `EasyWeChat` 等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值