第三方微信支付

微信支付

  • 微信支付是什么
  • 微信支付的流程
  • 微信支付正的很坑

    1) 首先我们上套话微信支付是什么:微信支付是集成在微信客户端的支付功能,用户可以通过手机完成快速的支付流程。微信支付以绑定银行卡的快捷支付为基础,向用户提供安全、快捷、高效的支付服务。
    2)微信支付的流程

    微信的支付的流程大致可分为 两步走原则

    • (1)第一步呢就是调用微信支付提供de商户同意支付接口,获取第二步需要的预支付id,(prepred_id)
    • **(2)调用成功之后会返回一个xml文件,把xml解析出来,获取预支付id,来调用微信支付的界面。
      废话不多说我们上代码。**

    终极代码

     private class GetPrepayIdTask extends AsyncTask

调用同意支付网络请求的工具类

public class Util {

    private static final String TAG = "SDK_Sample.Util";

    public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        bmp.compress(CompressFormat.PNG, 100, output);
        if (needRecycle) {
            bmp.recycle();
        }

        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

    public static byte[] getHtmlByteArray(final String url) {
        URL htmlUrl = null;
        InputStream inStream = null;
        try {
            htmlUrl = new URL(url);
            URLConnection connection = htmlUrl.openConnection();
            HttpURLConnection httpConnection = (HttpURLConnection)connection;
            int responseCode = httpConnection.getResponseCode();
            if(responseCode == HttpURLConnection.HTTP_OK){
                inStream = httpConnection.getInputStream();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        byte[] data = inputStreamToByte(inStream);

        return data;
    }

    public static byte[] inputStreamToByte(InputStream is) {
        try{
            ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
            int ch;
            while ((ch = is.read()) != -1) {
                bytestream.write(ch);
            }
            byte imgdata[] = bytestream.toByteArray();
            bytestream.close();
            return imgdata;
        }catch(Exception e){
            e.printStackTrace();
        }

        return null;
    }

    private static final int MAX_DECODE_PICTURE_SIZE = 1920 * 1440;
    public static Bitmap extractThumbNail(final String path, final int height, final int width, final boolean crop) {
        Assert.assertTrue(path != null && !path.equals("") && height > 0 && width > 0);

        BitmapFactory.Options options = new BitmapFactory.Options();

        try {
            options.inJustDecodeBounds = true;
            Bitmap tmp = BitmapFactory.decodeFile(path, options);
            if (tmp != null) {
                tmp.recycle();
                tmp = null;
            }

            Log.d(TAG, "extractThumbNail: round=" + width + "x" + height + ", crop=" + crop);
            final double beY = options.outHeight * 1.0 / height;
            final double beX = options.outWidth * 1.0 / width;
            Log.d(TAG, "extractThumbNail: extract beX = " + beX + ", beY = " + beY);
            options.inSampleSize = (int) (crop ? (beY > beX ? beX : beY) : (beY 

注意:

本人当时写微信支付遇到好多的坑,一一例举如下:
- 从导入的jar包开始,网上大概有两个版本的jar包,建议你从微信支付的官网demo里面考入
- 网络请求的工具类必须是post请求,来携带xml参数,可以用我上面写的工具类,已经验证过
- sign也就是签名,需要经过两次,第一次网络请求的签名,携带的参数,都是需要卸载xml里面一起签名的。xml里面携带的参数可参见微信开发文档(https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
- 如果请求成功,当返回成功的xml文件,用工具类里面的decoml解析成Map集合类,获取prepred_id。

<pre>private void sendPayRequest(Map<String,String> result) {
    PayReq req = new PayReq();
      req.appId = Constants.APP_ID;
      req.partnerId = Constants.MUH_ID;//分配的商户号
      req.prepayId = result.get("prepay_id");//核心参数:预支付订单号
      req.packageValue = "Sign=WXPay";
      String secre32 = WeiXinPayUtils.getRandomStringByLength(32);
      req.nonceStr = secre32;//随机字符串,不长于32位。推荐随机数生成算法
      String timeStap = WeiXinPayUtils.getTimeCuttent()+"";
      req.timeStamp = timeStap;
      Map<String,Object>map = new HashMap<String,Object>();
      map.put("appid",Constants.APP_ID);
      map.put("partnerid",Constants.MUH_ID);
      map.put("prepayid",result.get("prepay_id"));
      map.put("package","Sign=WXPay");
      map.put("noncestr",secre32);
      map.put("timestamp",timeStap);
      req.sign = WeiXinPayUtils.getSign(map);
    // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
    //3.调用微信支付sdk支付方法
    // 调微信支付
    if(mApi.isWXAppInstalled()&&mApi.isWXAppSupportAPI()){
        mApi.registerApp(Constants.APP_ID);
        mApi.sendReq(req);
    }else{
        Toast.makeText(BuyActivity.this,"请先安装微信客户端",Toast.LENGTH_SHORT).show();
    }
}</pre>


当第二次请求成功之后的结构即刻返回到WXPayEntryActivity这个类里面,注意这个类一定是在你当前报名的wxapi文件夹下
<pre>

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
///
// 此页面用来显示微信的支付回调结果
///
private static final String TAG = “MicroMsg.SDKSample.WXPayEntryActivity”;

private IWXAPI api;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_wxentry);
    api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
    api.registerApp(Constants.APP_ID);
    api.handleIntent(getIntent(), this);
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    api.handleIntent(intent, this);
}

@Override
public void onReq(BaseReq req) {
}

@Override
public void onResp(BaseResp resp) {

    if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("支付结果");
        builder.setMessage("支付返回状态码:" + String.valueOf(resp.errCode));
        builder.show();
    }
}

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现微信支付需要以下步骤: 1. 获取微信支付的相关配置信息(如appId、商户号、支付密钥等)。 2. 创建统一下单接口,用于生成预支付订单。在此接口中需要将订单信息(如订单编号、订单金额等)通过统一下单API发送给微信服务器,并获取到预支付订单的信息(如prepay_id)。 3. 创建支付回调接口,用于接收微信服务器回调的支付结果。在此接口中需要对支付结果进行验证,并根据支付结果更新订单状态。 以下是代码实现: 1. 配置文件中添加微信支付相关配置 ``` # 微信支付相关配置 wxpay.appId=微信公众号appId wxpay.mchId=商户号 wxpay.key=支付密钥 wxpay.notifyUrl=http://localhost:8080/api/wxpay/notify ``` 2. 创建统一下单接口 ```java @RestController @RequestMapping("/api/wxpay") public class WxPayController { @Autowired private WxPayService wxPayService; @PostMapping("/unifiedorder") public ResultData unifiedOrder(@RequestBody WxPayUnifiedOrderRequest request) throws Exception { WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(request); return ResultData.success(result); } } ``` 3. 创建支付回调接口 ```java @RestController @RequestMapping("/api/wxpay") public class WxPayNotifyController { @Autowired private WxPayService wxPayService; @PostMapping("/notify") public String notify(HttpServletRequest request) throws Exception { String result = wxPayService.notify(request); return result; } } ``` 4. 创建微信支付服务类 ```java @Service public class WxPayService { @Autowired private WxPayConfig wxPayConfig; @Autowired private WxPayService wxPayService; @Autowired private OrderService orderService; /** * 创建预支付订单 * @param request * @return * @throws Exception */ public WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderRequest request) throws Exception { // 设置回调URL request.setNotifyUrl(wxPayConfig.getNotifyUrl()); // 生成订单信息 Order order = orderService.createOrder(request.getOrderId(), request.getOrderAmount()); // 组装统一下单API参数 WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest(); wxPayUnifiedOrderRequest.setOutTradeNo(order.getOrderNo()); wxPayUnifiedOrderRequest.setTotalFee(order.getActualAmount().intValue()); wxPayUnifiedOrderRequest.setBody(order.getOrderName()); wxPayUnifiedOrderRequest.setSpbillCreateIp(request.getSpbillCreateIp()); wxPayUnifiedOrderRequest.setTradeType(request.getTradeType()); // 调用统一下单API生成预支付订单 WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(wxPayUnifiedOrderRequest); // 返回预支付订单信息 return wxPayUnifiedOrderResult; } /** * 处理支付回调 * @param request * @return * @throws Exception */ public String notify(HttpServletRequest request) throws Exception { // 处理回调通知 WxPayOrderNotifyResult result = wxPayService.parseOrderNotifyResult(request.getInputStream()); // 验证签名 if (!wxPayService.checkSignature(result, wxPayConfig.getKey())) { return WxPayNotifyResponse.fail("签名验证失败").toXml(); } // 验证订单状态 Order order = orderService.getOrder(result.getOutTradeNo()); if (order == null) { return WxPayNotifyResponse.fail("订单不存在").toXml(); } if (order.getStatus() == OrderStatus.PAID.getValue()) { return WxPayNotifyResponse.success("订单已处理").toXml(); } // 修改订单状态 orderService.updateOrderStatus(order.getOrderNo(), OrderStatus.PAID.getValue()); // 返回成功响应 return WxPayNotifyResponse.success("订单处理成功").toXml(); } } ``` 以上是SpringBoot实现微信支付的基本代码,具体实现还需要根据自己的业务逻辑进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值