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

didme · 2016年07月16日 · 最后由 1208175976 回复于 2016年07月22日 · 6788 次阅读

谷歌了,好像没有什么类似的错误。 先说下我这里微信支付的流程: 下单之后,到订单详情页面。在订单详情页面点击微信支付,然后用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出错吗? 对这不是很清楚,特此请教下各位,是哪里出错了。
共收到 21 条回复

微信支付域名设置了么 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才行

微信这个的确是很头疼。

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