小程序支付模块和小程序退款模块

1 篇文章 0 订阅
1 篇文章 0 订阅

如果不了解微信支付文档的话。最好去把文档先看下。不然做的时候,有bug也不太清楚怎么调试;

整个微信支付过程中,需要向微信支付平台提交给几次请求?

一共是两次。
第一次(php后台发起)、发起预支付请求,获得腾讯应答的支付流水号;生成参数给小程序页面(其他的方式可能发给页面等~)
第二次、(小程序端用wx.requestpayment)使用预支付获得的流水号,发起支付请求(支付成功后,腾讯会调用你的通知页面,在通知页面才真实决定是否扣费成功)。

  • 小程序当前页面会同步接收微信发的errmsg:ok 通知你支付成功;
  • php后台会异步接收到微信发的参数通知你支付成功,里面包括 后台自己生成的订单流水号,微信支付流水号,支付金额,最后支付时间等等。根据实际情况做对应的记录。

每次提交的请求,包含哪些信息项,哪些需要加密,如何加密
这个具体去看微信官方开发文档,因为接入epay的原因,我这边只是简单做了调试就流程跑通了。

  1. https://pay.weixin.qq.com/index.php/extend/pay_setting
  2. 进入这个页面之后,设置开发配置在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

https://www.fastadmin.net/store/epay.html
因为后台用的fastadmin ,所以接入的是fastadmin 的epay易支付。
这个过程中基本上按照他给的文档就能顺下去:

//这个地方需要注意一下;/paytype/wechat 需要带上参数,由于epay是集成不同的支付方式,他提供的案例也写的挺清楚。没注意。在回调方法里面拿不到 提前配置好的微信参数
		$no_url = 'https://www.v.com/api/order/wxpay_notify/paytype/wechat';
        $type = "wechat";
        $params = [
            'amount'=>"0.01",
            'orderid'=> $order_id,
            'type' => $type,
            'title' => $order_info['order_title'],
            'notifyurl'=> $no_url,
            'returnurl'=>"https://www.v.com/api/order/wechatreturn/order_id/". $order_id,
           //这个returnurl 可以不写。是给网页使用的;
          	'method'=>"miniapp",
            'openid'=> $openid,
            'auth_code'=>"验证码"
        ];

        //1、统一下单 
        // 回调地址   wxpay_notify  
        $return = \addons\epay\library\Service::submitOrder($params); 
        $result = json_decode( $return );
        $this->success('请支付',$result);
        

查看命名空间是否有问题
如果是线下测试可能会报错:可能线下证书和环境有问题。
cURL error 60: SSL certificate problem: unable to get local issuer certifica

前端发起:
在这里插入图片描述

去微信小程序开发文档看发起支付也一样。

  payfor:function(){
    let params = {order_id:"202009010409572674"};
     api.request('POST', '/api/order/wxpayfororder',params).then((res) => {
      console.log(res);
      var payfor = res.data.data;
      wx.requestPayment(
        {
        'timeStamp': payfor.timeStamp,
        'nonceStr': payfor.nonceStr,
        'package': payfor.package,
        'signType': payfor.signType,
        'paySign': payfor.paySign,
        'success':function(res){
          console.log("订单支付成功",res);
          //res 返回的时候,不是以code返回。需要做一定处理;
        },
        'fail':function(res){},
        'complete':function(res){}
        })
       
    }).catch((res) => {
      tools.toast.fail('获取数据失败,请稍后再试');
    })  
  }

第一次预支付获取的参数 用接口 /api/order/wxpayfororder 返回 如下 ;
在这里插入图片描述

关于退款

在这里插入图片描述

一直报错appid不能为空。其实是因为后台设置的时候;
在这里插入图片描述

经过一些列的调试

[0] InvalidArgumentException in CurlFactory.php line 449
SSL certificate not found: epay/certs/apiclient_cert.pem
报了这个错误。
找不到证书

//前面的 {“return_code”: “FAIL”,“return_msg”: “证书验证失败”},
// “/www/wwwroot/v/addons/epay/certs/apiclient_cert.pem”,
// “/www/wwwroot/v/addons/epay/certs/apiclient_key.pem” 后台配置一定把斜杆加上
在这里插入图片描述

跟着微信生成验证码走就能获取正确的证书,
然后把证书重新上传到正确的位置。

这样子就能做退款操作了。

重复退款会报错;
getResult error:OK - 订单已全额退款等类型的错误。
可以对你的代码进行逻辑处理和管理员操作订单日志记录等等。

支付可能碰到的bug

getResult error:body参数长度有误FAIL
body不是UTF8编码FAIL
需要对支付过程的 title做限制;

退款百分比也是根据公司业务写对应的方法

需要注意的地方

应用场景

当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。

注意:

1、交易时间超过一年的订单无法提交退款

2、微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。 一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号

3、请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次

错误或无效请求频率限制:6qps,即每秒钟异常或错误的退款申请请求不超过6次

4、每个支付订单的部分退款次数不能超过50次

5、如果同一个用户有多笔退款,建议分不同批次进行退款,避免并发退款导致退款失败

由于百分比的问题:
如果出现 getResult error:OK - 订单金额或退款金额与之前请求不一致,请核实后再试SUCCESS
可以看下退款总金额,和需要退款的金额是不是写错了。
另外退款单号,如果分多次退的情况,不能一样。但是原订单无需改动。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值