新手问题 微信支付无法调起 H5 支付页面,只有闪现微信支付的 Logo

didme · 2016年07月16日 · 最后由 eastboy 回复于 2019年10月20日 · 11622 次阅读

谷歌了,好像没有什么类似的错误。 先说下我这里微信支付的流程: 下单之后,到订单详情页面。在订单详情页面点击微信支付,然后用 ajax 到 pay 页面去统一下单,签名,之后返回 json 数据给 ajax 的回调函数。 现在出现的问题是: 微信里点击微信支付之后,只是闪现了微信支付的等待的 Logo. 用 nw.js sdk 测试,是提示跳转到订单详情页面,config 注入成功。在点击微信支付之后,出现

[JSSDK Info] chooseWXPay  
input  {"timeStamp":"1468636652","nonceStr":"xxxxxxxxxxxxxxxxxxxx","package":"prepay_id=xxxxxxxxxxxxxxxxxxx","paySign":"xxxxxxxxxxxxxxxxxxxxx","signType":"MD5"};  
output  {"errMsg":"没有此SDK或暂不支持此SDK模拟"}

开发的环境是本地的 nginx 把微信后台设置的域名转发到本地。 订单详情页的 js 代码如下:

$(document).on('click', 'li.js-crm-wechat-to-pay', function(){
  var orderId = $(this).data("id");
  console.log("开始点击了微信支付");
  $.ajax({
    url: "/crm/store_orders/pay/",
    method: 'get',
    dataType: 'json',
    success: function(data){
      console.log(data);
      if(data.status == true){
        console.log("成功在js里回调了,status是true!");
        wx.chooseWXPay({
          "timestamp": data.pay_params['timeStamp'],
          "nonceStr": data.pay_params['nonceStr'],
          "package": data.pay_params['package'],
          "signType": data.pay_params['signType'],
          "paySign": data.pay_params['paySign'], // 支付签名
           success: function (res) {
           }
         });
      }else {
        console.log(data.msg);
      }
    },
    error: function(XMLHttpRequest){
      console.log("出错了,错误如下:");
      console.log(XMLHttpRequest);
    }
  });
});

支付的方法:

def pay
  #功能测试通过之后抽取出去
  @store_order = StoreOrder.last#find(params[:id])
  params = {
    body: @store_order.orderable_name,
    out_trade_no: @store_order.numero,
    total_fee: (@store_order.amount * 100).to_i, # 需要转换为分
    spbill_create_ip: request.remote_ip || '127.0.0.1',
    notify_url: weixin_notify_pay_notify_path,
    trade_type: "JSAPI",
    nonce_str: SecureRandom.hex,
    openid: session[:openid]
   }
   @result = WxPay::Service.invoke_unifiedorder(params)
   @sign_package = $weixin_client.get_jssign_package(request.url)
   if @result.nil?
    Rails.logger.info "这里的@result是nil"
    render json: {status: false, error: '签名是空的.'}
   else
     if @result['return_code']=='FAIL'
       Rails.logger.info "这里的@result是FAIL"
       render json: {status: false, msg: "#{@result.to_s},#{params.to_s}"}
     else
       @pay_ticket_param = {
         timeStamp: @sign_package["timestamp"],
         nonceStr: @sign_package["nonceStr"],
         package: "prepay_id=#{@result['prepay_id']}",
         signType: "MD5",
         appId: WxPay.appid
       }
       @pay_ticket_param = {
         paySign: WxPay::Sign.generate(@pay_ticket_param)
       }.merge(@pay_ticket_param)
       Rails.logger.info "这里的是成功返回#{@pay_ticket_param}"
       render json: {status: true, pay_params: @pay_ticket_param}
     end
   end
end

这里

@pay_ticket_param 

在 js 的回调里是有正常输出。

路由如下:

collection do
  get :pay, trailing_slash: true
end

测试授权目录是: http://example.com/crm/store_orders/pay/ js 安全域:example.com 两个疑问:

  1. 本地使用 nginx 转发了之后,也调不起来吗?
  2. show 页面注入的 sdk 配置,pay 的异步方法,导致 sdk 出错吗? 对这不是很清楚,特此请教下各位,是哪里出错了。

微信支付域名设置了么 nginx 转发配置 proxy_set_header Host $http_host; 了么

我本不想回的。。。你们的代码写的太让人难过了,基本的空格都没对齐

#1 楼 @zj0713001 恩,难怪没有人回我。这个域名目前是线上的产品在用。只能本地映射这个。支付授权目录,网页授权获取用户基本信息,js 安全域都设置了。都是在这个 example.com 下面。 然后我把 nginx 的转发配置 proxy_set_header Host $http_host;或者 proxy_set_header Host example.com; 也不行。报错是:没有此 SDK 或暂不支持此 SDK 模拟。

@didme 模拟器不支持微信支付的测试,需要用自己手机来测试。

#3 楼 @lyfi2003 手机上测试是只有闪现出微信支付的 logo. 模拟器上面就是那个没有 sdk 的提示。

#4 楼 @didme 在 js 里初始化 wx 时开启 debug 模式,慢慢调吧。

#5 楼 @lyfi2003 初始化,注入 sdk 配置是在 show 页面。进入 show 页面显示是成功注入。然后在 show 页面点击触发 ajax 异步,这样没有再次注入 sdk 配置信息,会有影响吗?

#5 楼 @lyfi2003 在 chooseWXPay 后面加上 fail 函数和 cancel 函数,果断是 fail。

注入 sdk 配置的时候,是在显示页面吧?支付的路径是 pay,而且是异步过去的,没有再次注入吧。这样导致签名的数据和注入数据不一致了。

#7 楼 @didme 用微信的工具 移动调试 然后看看 ajax 回来的 data 是啥

#7 楼 @didme 你的情况无非 2 种错误 1、data 参数里有不对的 2、公众号微信支付的配置不对,另:给自己的手机加测试白名单了吗

#10 楼 @zj0713001 ajax 回来的 data 中的 timestamp 和 nonceStr 与 sdk 注入的 config 中的 nonceStr, timestamp 不同。和 #8 楼 @xiaozhu0827 说的情况类似。

#11 楼 @didme 刚看到你的配置 你的 show 页面才是参与计算的 url 你的测试授权目录也应该是 show 页面 ajax 的请求跟页面地址没有任何关系 只要你页面本身没跳转 url 就必须还得是进去时的地址

#12 楼 @zj0713001 那就是说统一下单,签名还是可以在 pay 方法,支付的目录改成 show 就可以了。ajax 到 pay 方法,他的地址就是 pay 的当前地址了呀。我到时试试看😁

#13 楼 @didme

ajax 到 pay 方法,他的地址就是 pay 的当前地址了呀。

这个不对 ajax 不改变当时的地址

#14 楼 @zj0713001 👍 修改了目录的确是可以了。保险起见,最好还是得等 15 分钟左右。

#3 楼 @lyfi2003 那个模拟器,的确是不支持支付测试。

#14 楼 @zj0713001 模拟器可以获取 code 和 openid,手机上不行,应该是因为域名的问题吧。 手机手动代理的 ip 是本机的 Ip(内网的)。手机获取 code 要重定向的原因,所以获取不到吧?

#17 楼 @didme 你把 rails s -b0 开放到内网 IP 上就可以用手机访问了 不用代理

#18 楼 @zj0713001 这样跑的就是本地的服务了。没有使用内网穿透。 我就是相当于在本地电脑上部署了下,跑的是 production 环境。 现在尴尬的是模拟器可以获取到 code 和 openid,手机就获取不到。(但是呢,手机上可以支付,模拟器就不支持支付。) 所以我怀疑是手机上获取 code 的时候,微信没有重定向回来。

#19 楼 @didme 微信的重定向仅仅是按照你给他的 url 直接拼给你 所以你手机要能解析你给微信的 url 才行

微信这个的确是很头疼。

个人免签支付,我写了个 demo:https://gitee.com/eastboy/ali_wx_pay

需要 登录 后方可回复, 如果你还没有账号请 注册新账号