微信支付
我的店铺收的钱,收到哪里了?
微信登录后能收到支付结果,未登录时没有任何结果
{"code":"SIGN_ERROR","detail":{"detail":{"issue":"sign not match"},"field":"signature","location":"authorization","sign_information":{"method":"POST","sign_message_length":423,"truncated_sign_message":"POST\n/v3/fund-app/mch-transfer/transfer-bills\n1737542491\n78ed98ef523cba6698e3fca620a3e7a6\n{\"appid\"\n","url":"/v3/fund-app/mch-transfer/transfer-bills"}},"message":"错误的签名,验签失败"} 实在没撤了,哪位高人指导一下!
因为用的是uniapp,前端反应API还没封装上 目前的需求是:用户充值钱包-->消费后还有剩余-->发起退款 。因为可能会出现充值好几笔,然后一起性全部退款,所以微信支付退款接口应该怎么样设计才能实现,有没有大佬实现过类似的需求
调用新版商家转账到零钱参数需要使用微信支付公钥加密,但是我们为什么没有文档上的微信支付公钥????????? [图片] 顺便说一下,改的真是一坨,不是给开发者跟用户提供便捷,而是增加复杂性
使用php对接投诉api,创建回调地址后,微信支付走的回调中是不是没有用户发起的留言,需要自己走协商列表查询并保存数据吗
https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/virtual-payment.html
使用商家转账:/v3/fund-app/mch-transfer/transfer-bills ,appId:wx3f061fd153b6dbbc ,调用一直报 401 Unauthorized, Response Code: 401 2025-01-22 15:39:09 INFO [http-nio-8889-exec-3] com.qubian.user.util.WeChatPay - ac51f9647fe6c1dd 1753cc0a87bb7f44 - Response message:Unauthorized 2025-01-22 15:39:09 INFO [http-nio-8889-exec-3] com.qubian.user.util.WeChatPay - ac51f9647fe6c1dd 1753cc0a87bb7f44 - Error: Server returned HTTP response code: 401 for URL: https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/transfer-bills 自己做签名校验,正常,问一下,Wechatpay-Serial 必填 string 【微信支付公钥ID】或【微信支付平台证书序列号】 请求参数中的敏感字段,需要使用微信支付公钥加密(推荐),请参考获取微信支付公钥ID说明以及微信支付公钥加密敏感信息指引;也可以使用微信支付平台证书公钥加密,参考获取平台证书序列号、平台证书加密敏感信息指引 直接使用证书序列号就可以,还是需要使用.p12证书加密,再传?就返回Unauthorized,其他错误消息就没有返回,然后就不知道怎么弄了
微信的异步请求,<transaction_id><![CDATA[4200002532202501220797559574]]></transaction_id> ,商户侧收到了,但返回给微信端能收到吗?为什么微信端连续不停的发异步请求过来?
Exception in thread "main" com.wechat.pay.java.core.exception.HttpException at com.wechat.pay.java.core.http.okhttp.OkHttpClientAdapter.innerExecute(OkHttpClientAdapter.java:52) at com.wechat.pay.java.core.http.AbstractHttpClient.execute(AbstractHttpClient.java:46) at com.wechat.pay.java.core.certificate.CertificateDownloader.download(CertificateDownloader.java:82) at com.wechat.pay.java.core.certificate.AutoCertificateService.lambda$register$0(AutoCertificateService.java:66) at com.wechat.pay.java.core.certificate.AutoCertificateService.register(AutoCertificateService.java:72) at com.wechat.pay.java.core.certificate.RSAAutoCertificateProvider.<init>(RSAAutoCertificateProvider.java:40) at com.wechat.pay.java.core.certificate.RSAAutoCertificateProvider.<init>(RSAAutoCertificateProvider.java:19) at com.wechat.pay.java.core.certificate.RSAAutoCertificateProvider$Builder.build(RSAAutoCertificateProvider.java:139) at com.wechat.pay.java.core.RSAAutoCertificateConfig$Builder.build(RSAAutoCertificateConfig.java:117) at com.zjsy.certificate.utils.JsapiServiceExtensionExample.main(JsapiServiceExtensionExample.java:45) Caused by: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:210) at java.net.SocketInputStream.read(SocketInputStream.java:141) at sun.security.ssl.InputRecord.readFully(InputRecord.java:465) at sun.security.ssl.InputRecord.read(InputRecord.java:503) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379) at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:336) at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:300) at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:185) at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.java:224) at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.java:108) at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.java:88) at okhttp3.internal.connection.Transmitter.newExchange(Transmitter.java:169) at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:41) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117) at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:94) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117) at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142) at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:88) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117) at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:229) at okhttp3.RealCall.execute(RealCall.java:81) at com.wechat.pay.java.core.http.okhttp.OkHttpClientAdapter.innerExecute(OkHttpClientAdapter.java:49) ... 9 more
为什么新版商家转账到零钱,拉起用户确认收款界面,但是用户关掉了并没有点击确认收款,用户此时没有收到款,这是正常的,但是查看商户运营号,这时候发现商户运营号的钱却被扣了,那这个钱扣到哪里了 [图片] 这两笔都是,拉起用户确认收款了,但是点击关闭,没有确认,钱却被扣了。
开发了一个web版的程序,需要微信支付,AppID填哪一个?现在申请的是微信一般商户,先谢谢了
[图片]
业务场景: 我司有一批车辆(归属于不同资产方)提供租赁服务,用户使用同一个用户端小程序进行租赁,生成交易订单。 业务需求: 同一个小程序内的租车业务订单,我们希望根据车辆的资产方进行收款,交易款直达对应资产方的微信商户(已在小程序内完成商户号关联)。 即: 用户租了一辆电动车(资产方为A),交易款项结算至A商户;用户租了一辆电动车(资产方为B),交易款项结算至B商户。 请问能否实现?可以的话需要如何操作? 另外,请问小程序关联商户号的有没有上限个数?
为什么微信付款时,单笔订单超过1万,就支付失败 ,提示 “调用支付JSAPI缺少参数: total_fee”,,,具体原因是什么呢? 小于1万是可以的,大于1万就失败了。 调用的是统一下单接口:/v3/pay/transactions/jsapi,,,这个接口返回值里prepay_id为空 。 金额是分的:1774000
后端生成签名代码 [图片] 返回给前端信息 [图片] 前端接收代码与错误显示 [图片] [图片]
[图片]
微信回调通知给了成功的应答体过了四个小时之后再一次给了通知
public function transfer($batch_name, $out_trade_no, $money, $openid) { $url = 'https://api.mch.weixin.qq.com/v3/transfer/batches'; $pars = []; $pars['appid'] = '*****';//直连商户的appid $pars['out_batch_no'] = $out_trade_no;//商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一 $pars['batch_name'] = $batch_name;//该笔批量转账的名称 $pars['batch_remark'] = $batch_name;//转账说明,UTF8编码,最多允许32个字符 $pars['total_amount'] = intval($money * 100);//转账总金额 单位为“分” $pars['total_num'] = 1;//转账总笔数 $pars['transfer_detail_list'][0] = [ 'out_detail_no' => 'transfer' . $out_trade_no, 'transfer_amount' => $pars['total_amount'], 'transfer_remark' => $batch_name, 'openid' => $openid ];//转账明细列表 $token = $this->getToken($pars);//获取token $res = $this->https_request($url, json_encode($pars), $token);//发送请求 $data = json_decode($res, true); return $data; } function https_request($url, $data = null, $token) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, (string)$url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($data)) { curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //添加请求头 $headers = [ 'Authorization:WECHATPAY2-SHA256-RSA2048 ' . $token, 'Accept: application/json', 'Content-Type: application/json; charset=utf-8', 'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', ]; if (!empty($headers)) { curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); } $output = curl_exec($curl); curl_close($curl); return $output; } public function getToken($pars) { // $url = 'https://api.mch.weixin.qq.com/v3/certificates'; $url = 'https://api.mch.weixin.qq.com/v3/transfer/batches'; $http_method = 'POST';//请求方法(GET,POST,PUT) $timestamp = time();//请求时间戳 $url_parts = parse_url($url);//获取请求的绝对URL $nonce = $timestamp . rand('10000', '99999');//请求随机串 $body = json_encode((object)$pars);//请求报文主体 $stream_opts = [ "ssl" => [ "verify_peer" => false, "verify_peer_name" => false, ] ]; try { $certPem = $this->getCertPem(); $apiclient_cert_path = $certPem['certPem']; $apiclient_key_path = $certPem['keyPem']; $apiclient_cert_arr = openssl_x509_parse(file_get_contents($apiclient_cert_path, false, stream_context_create($stream_opts))); $serial_no = $apiclient_cert_arr['serialNumberHex'];//证书序列号 $mch_private_key = file_get_contents($apiclient_key_path, false, stream_context_create($stream_opts));//密钥 $merchant_id = '******'; $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : "")); $message = $http_method . "\n" . $canonical_url . "\n" . $timestamp . "\n" . $nonce . "\n" . $body . "\n"; openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption'); $sign = base64_encode($raw_sign);//签名 $schema = 'WECHATPAY2-SHA256-RSA2048'; $token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"', $merchant_id, $nonce, $timestamp, $serial_no, $sign);//微信返回token } catch (\Exception $e) { // throw new BaseException(['msg' => $e->getMessage()]); return json(['code'=>1,'msg'=>$e->getMessage()]); } return $token; } /** * 获取cert证书文件 * @return array * @throws BaseException */ private function getCertPem() { // cert目录 $filePath = dirname(__DIR__) . '/public/cert/wechat/'; return [ 'certPem' => $filePath . 'apiclient_cert.pem', 'keyPem' => $filePath . 'apiclient_key.pem' ]; } //在别的方法里调用,报错{code: "INVALID_REQUEST", message: "Http头缺少Accept或User-Agent"} $res = $this->transfer('结算手工费', $out_trade_no, $craft_fee, $openid); return json($res);
商家转账接口transfer_amount字段传的30,商户余额1.98,调用的时候提示资金不足