微信小程序第四天(微信小程序支付)_微信小程序支付wechatutil.md5工具类-程序员宅基地

技术标签: 微信小程序  支付  微信  小程序  

微信小程序支付的前置准备:
1.微信商户平台账号
2.微信小程序账号
3.微信小程序开通支付接口(个人暂时不支持开通支付)

前台需要的操作:
1.登录获取code,传给后台
2.获取后台传过来的值调用wx.requestPayment方法
后台需要的操作:
1.通过前台传过来的code来获取用户的openId
2.生成sign
3.获取perpay_id
4.再生成一次前台需要的paySign

具体操作:
登录获取code:

wx.login({
        success: function(res){
    
          // success
          console.log('这里有code',res)
        },
        fail: function(res) {
    
          // fail
        },
        complete: function(res) {
    
          // complete
        }
      })

传到后台:

wx.request({
        url: 'https://URL',//后台URL
        data: {},//登录获取的code
        method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
        // header: {}, // 设置请求的 header//后台规定的请求头
        //调用了之后无操作一下三个方法可以不写
        success: function(res){
          // success
        },
        fail: function(res) {
          // fail
        },
        complete: function(res) {
          // complete
        }
      })

后台通过过code获取oppenid只需要访问这个链接:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=前台传过来的CODE&grant_type=authorization_code

生成sign和得到perpay_id(此处后台用JAVA由于后台代码太多,我就放在最后面,有需要的可以自己进行查看)

其中获取perpay_id生成的sign需要的参数是我遇到的一个坑,请一定要注意你往微信传的值都是sign需要的value,其中openId在参数里面写的是否,但是微信小程序支付用到的trade_type是JSAPI,所以微信小程序的openId也是必须的参数。
当这些都准备好了之后你就可以获取perpay_id

接口链接
URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder

这个链接必须是xml格式的,前台是没法调用的。

有了perpay_id之后,在获取paySign(前台需要的)。这里不一定需要后台生成,前台也有相关的代码来生成。他需要的参数:
appId,nonceStr,package,signType,timeStamp,key
这是我遇到的坑二,因为你获取到了perpay_id时他会给你返回一个sign我之前以为是这个。

得到sign的代码:

/**  
    * 微信支付签名算法sign  
    * @param characterEncoding  
    * @param parameters  
    * @return  
    */    
   @Test   
   public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters){    
       StringBuffer sb = new StringBuffer();    
       Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)    
       Iterator it = es.iterator();    
       while(it.hasNext()) {    
           Map.Entry entry = (Map.Entry)it.next();    
           String k = (String)entry.getKey();    
           Object v = entry.getValue();    
           if(null != v && !"".equals(v)     
                   && !"sign".equals(k) && !"key".equals(k)) {    
               sb.append(k + "=" + v + "&");    
           }    
       }    

       sb.append("key=" + WeChatPayUtils.key);    
       System.out.println("字符串:"+sb.toString());  
       String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();    
       return sign;    
   }    

MD5Util工具类代码如下:

package cn.cqzdkj.utils;  

import java.security.MessageDigest;  

public class MD5Util {
      
    private static String byteArrayToHexString(byte b[]) {  
        StringBuffer resultSb = new StringBuffer();  
        for (int i = 0; i < b.length; i++)  
            resultSb.append(byteToHexString(b[i]));  

        return resultSb.toString();  
    }  

    private static String byteToHexString(byte b) {  
        int n = b;  
        if (n < 0)  
            n += 256;  
        int d1 = n / 16;  
        int d2 = n % 16;  
        return hexDigits[d1] + hexDigits[d2];  
    }  

    public static String MD5Encode(String origin, String charsetname) {  
        String resultString = null;  
        try {  
            resultString = new String(origin);  
            MessageDigest md = MessageDigest.getInstance("MD5");  
            if (charsetname == null || "".equals(charsetname))  
                resultString = byteArrayToHexString(md.digest(resultString  
                        .getBytes()));  
            else  
                resultString = byteArrayToHexString(md.digest(resultString  
                        .getBytes(charsetname)));  
        } catch (Exception exception) {  
        }  
        return resultString;  
    }  

    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",  
        "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };  
}  

然后在需要的地方直接调用上面的ctreasign这个方法就行了。

SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();    
      parameters.put("appid", appid);    
      parameters.put("mch_id", mch_id);  
      parameters.put("nonce_str",nonce_str);   
      parameters.put("body", body);   
      parameters.put("out_trade_no", "20170215");  
      parameters.put("total_fee", 1);  
      parameters.put("spbill_create_ip", "x.x.x.x");  
      parameters.put("notify_url","http://xxxxx.com");  
      parameters.put("trade_type", "JSAPI");  
      parameters.put("openid", "oGY_ZvxxxxxM");  
      parameters.put("sign","");  


      String characterEncoding = "UTF-8";    
      String mySign = createSign(characterEncoding,parameters);    
      System.out.println("我 的签名是:"+mySign);   

干活系列项目地址:
码云:https://gitee.com/mrxu314/xcx_gh
gitHub:https://github.com/mrxu0/xcx_gh
希望这篇文章能够帮助到你们
欢迎大家关注我的公众号吵吵日记:
这里写图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37479946/article/details/70230869

智能推荐

Aubo机械臂初学(愁)——1、gazebo和Rviz联合仿真_aubo机械臂仿真-程序员宅基地

文章浏览阅读1.7k次,点赞5次,收藏33次。auboi5机械臂初学者遇到的各种问题合集_aubo机械臂仿真

POJ_1064_Cable master【二分】_poj - 1064 二分枚举答案 floor向下取整函数 原创-程序员宅基地

文章浏览阅读1.7k次。/*Cable masterTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 43878 Accepted: 9409DescriptionInhabitants of the Wonderland have decided to hold a regional programmi_poj - 1064 二分枚举答案 floor向下取整函数 原创

【前端学习】HTML学习笔记-table_table前端心得-程序员宅基地

文章浏览阅读88次。<table><colgroup><col bgcolor='red' width=200></colgroup><thead><tr><th></th></tr><tbody><tr><td></td></t..._table前端心得

CSS 之 line-height 实现单行文字垂直居中的原理_css height=line-height 可以垂直居中-程序员宅基地

文章浏览阅读1.5k次,点赞3次,收藏12次。基础知识line-height 与 font-size 的计算值之差(在 CSS 中成为“行间距”)分为两半,分别加到一个文本行内容的顶部和底部。我们暂且称之为顶部距离和底部距离,就是上图中的蓝色区域。也就是说: line-height = 顶部距离 + 内容高度(顶线和底线之间的距离) + 底部距离;顶部距离 = 底部距离;示例一: 当line-height 等于 height 时,文字垂直居中文本默认大小16px。结果:文字垂直居中。顶部距离 = 底部距离 = (line-heig_css height=line-height 可以垂直居中

uniapp实战——实现详情其他部分的结构_uniapp 实现关系图谱-程序员宅基地

文章浏览阅读241次。QQ 1274510382Wechat JNZ_aming商业联盟 QQ群538250800技术搞事 QQ群599020441解决方案 QQ群152889761加入我们 QQ群649347320共享学习 QQ群674240731纪年科技aming网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。叮叮叮:产品已上线 —>关注 官方认证-微信公众号——济南纪年信息科技有限公司民生项目:商城加盟/娱乐交友/创业商圈/外包兼职开发-项目发布/安全项目:态.._uniapp 实现关系图谱

如何查看其他人的ABAP authorization check log_查看authorization-程序员宅基地

文章浏览阅读375次。Created by Jerry Wang on Jul 29, 2014 Go to start of metadata在做middleware相关的scenario操作时,有时候需要evaluate其他user的authorization check log,例如在CRM tcode SMW01里发现BDoc state为validation error,点击show error butto..._查看authorization

随便推点

I.MX6 eMMC分区挂载-程序员宅基地

文章浏览阅读244次。/********************************************************************* * I.MX6 eMMC分区挂载 * 说明: * 如果想要修改分区的挂载情况,可以修改fstab.freescale文件。 * * ..._imx6 分区挂载

【opencv-python】霍夫圆检测_霍夫圆圆心检测python-程序员宅基地

文章浏览阅读6.7k次,点赞10次,收藏55次。霍夫变换检测直线的原理是利用累加器找到最大的(ρ,θ)(ρ,θ)(ρ,θ)数对,如文章所述。圆形的数学表达式为(x−xcenter)2+(y−ycenter)2=r2(x-x_{center})^2+(y-y_{center})^2=r^2(x−xcenter​)2+(y−ycenter​)2=r2,其中(xcenter,ycenter)(x_{center},y_{center})(xcenter​,ycenter​)为圆心坐标,rrr为圆的直径。因此可知一个圆需要xcenter,ycenter,rx_{_霍夫圆圆心检测python

码仔精选,Android面试题-程序员宅基地

文章浏览阅读171次。码个蛋(codeegg) 第 822次推文码妞看世界1.Java创建对象的几种方式使用new关键字使用Class类的newInstance方法使用Constructor类的newIn..._码个蛋 《每日一道面试题》 第一期

Milking Time (poj 3616 简单DP)_poj milking time-程序员宅基地

文章浏览阅读2.5k次,点赞3次,收藏5次。题意:给个时间长度n,m个工作时间段和每个时间段能完成的工作量,一次只能做一个工作并且一旦开始做就要把它做完,要求选择的两个工作时间段之间至少相差r时间(中间需要休息嘛)求选择那些工作n时间内能完成的最大工作量。输出最大值。思路:先按工作的结束时间从小到大排序,再动态规划。dp[i]表示从头开始取到第i段所获得的最大值。二重循环,如果第i段之前的某个段的结束时间加上r小于等于第i段的开始时间,则更新dp[i]。_poj milking time

GDCM:gdcm::Global的测试程序_gbcm main show main screen-程序员宅基地

文章浏览阅读333次。GDCM:gdcm::Global的测试程序GDCM:gdcm::Global的测试程序GDCM:gdcm::Global的测试程序#include "gdcmGlobal.h"#include "gdcmDicts.h"#include "gdcmDict.h"#include "gdcmDefs.h"int TestGlobal(int, char *[]){ // case 1 // Get the global singleton: gdcm::Trace::DebugOn_gbcm main show main screen

理解 OAuth 2.0_shanks user-agent-程序员宅基地

文章浏览阅读278次。转载自http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html作者:阮一峰日期:2014年5月12日OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。更新:我后来又写了一组三篇的《OAuth 2.0 教程》,更加通俗,并带有代码实例,欢迎阅读。一、应用场景..._shanks user-agent