• android开发之微信支付功能的实现


    移动开发中,支付类的App越来越多,对于开发者来说也是不可少的,不可不会的:下面就来说一说支付开发的流程


    1.申请你的AppID

    请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将该应用提交审核,只有审核通过的应用才能进行开发。

    2.下载SDK及API文档

    Android Studio环境下:
    在build.gradle文件中,添加如下依赖即可:
    dependencies {
        compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.0.2'

    }


    3.在代码中使用开发工具包


    [1] AndroidManifest.xml 设置

    添加必要的权限支持:

    1. <uses-permission android:name="android.permission.INTERNET"/>  
    2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
    3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
    4. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  
    5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  


    [2] 注册到微信

    要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id。(如下图所示,可以在程序入口Activity的onCreate回调函数处,或其他合适的地方将你的应用id注册到微信。注册函数示例如下图所示。
    官方申请的合法的App—id
    public static final String APP_ID = "你的key";
    //第三方和微信的接口:
      private IWXAPI api;

    [3] 发送请求或响应到微信

    现在,你的程序要发送请求或发送响应到微信终端,可以通过IWXAPI的 sendReq 和 sendResp 两个方法来实现。
    boolean sendReq(BaseReq req);
    sendReq是第三方app主动发送消息给微信,发送完成之后会切回到第三方app界面。
    boolean sendResp(BaseResp resp);
    sendResp是微信向第三方app请求数据,第三方app回应数据之后会切回到微信界面。

    JAVA代码:
    1. /**  
    2.      *  第三方应用发送到微信的请求处理后的响应结果,会回调到该方法  
    3.      *   arg0。errCode  0成功 -1支付失败 -2取消   
    4.      */  
    5.     @Override  
    6.     public void onResp(BaseResp resp) {  
    7.         Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);  
    8.         if (resp.errCode == 0) {//支付成功  
    9.             Intent intent = new Intent();  
    10.             intent.setAction("fbPayAction");  
    11. //          intent.setAction("goodsPayAction");  
    12. //          intent.setAction("integraPayAction");     
    13.             sendBroadcast(intent);    
    14.             Toast.makeText(getApplicationContext(), "支付成功", 0).show();  
    15.             finish();  
    16.         }else if (resp.errCode == -1) {//支付失败  
    17.             Toast.makeText(getApplicationContext(), "支付失败", 0).show();  
    18.             finish();  
    19.         }else {//取消  
    20.             Toast.makeText(getApplicationContext(), "支付取消", 0).show();  
    21.             finish();  
    22.         }  

    [4] 接收微信的请求及返回值

    如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作:
    a. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity(例如应用程序的包名为net.sourceforge.simcpux,则新添加的类如下图所示)



    并在manifest文件里面加上exported属性,设置为true,例如:
     

    1. <!-- 微信支付 -->  
    2.        <activity  
    3.            android:name="com.example.xiangcuntiandi.wxapi.WXPayEntryActivity"  
    4.            android:configChanges="orientation|keyboardHidden|navigation"  
    5.            android:exported="true"  
    6.            android:screenOrientation="behind" >  
    7.        </activity>  


    b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法
    c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下图:
          api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
            api.handleIntent(getIntent(), this);
    当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。

    //Java代码:
    1. public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{  
    2.     private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";  
    3.     private IWXAPI api;  
    4.     @Override  
    5.     public void onCreate(Bundle savedInstanceState) {  
    6.         super.onCreate(savedInstanceState);  
    7.         setContentView(R.layout.pay_result);  
    8.         api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);  
    9.         api.handleIntent(getIntent(), this);  
    10.     }  
    11.     @Override  
    12.     protected void onNewIntent(Intent intent) {  
    13.         super.onNewIntent(intent);  
    14.         setIntent(intent);  
    15.         api.handleIntent(intent, this);  
    16.     }  
    17.     @Override  
    18.     public void onReq(BaseReq req) {  
    19.     }  
    20.     /**  
    21.      *  第三方应用发送到微信的请求处理后的响应结果,会回调到该方法  
    22.      *   arg0。errCode  0成功 -1支付失败 -2取消   
    23.      */  
    24.     @Override  
    25.     public void onResp(BaseResp resp) {  
    26.         Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);  
    27.         if (resp.errCode == 0) {//支付成功  
    28.             Intent intent = new Intent();  
    29.             intent.setAction("fbPayAction");  
    30. //          intent.setAction("goodsPayAction");  
    31. //          intent.setAction("integraPayAction");     
    32.             sendBroadcast(intent);    
    33.             Toast.makeText(getApplicationContext(), "支付成功", 0).show();  
    34.             finish();  
    35.         }else if (resp.errCode == -1) {//支付失败  
    36.             Toast.makeText(getApplicationContext(), "支付失败", 0).show();  
    37.             finish();  
    38.         }else {//取消  
    39.             Toast.makeText(getApplicationContext(), "支付取消", 0).show();  
    40.             finish();  
    41.         }  
    42.         }  

    生成订单后只需要做如下处理:


     我们都只道微信的支付流程是:提交订单到服务器,服务器将信息传递到微信支付的服务器,微信服务器响应后返回数据到自己的服务器,服务器又返回数据到客户端:取出数据后,跳转微信支付界面:、

    1. /        /微信服务器返回的数据:调用这些数据到支付端  
    2.   >     PayReq req = new PayReq();  
    3.         req.appId = appid;  
    4.         req.partnerId = partnerid;  
    5.                 req.prepayId = prepayid;  
    6.         req.nonceStr = noncestr;  
    7.             req.timeStamp = timestamp;  
    8.         req.packageValue = packageValue;  
    9.         req.sign = sign;  
    10.         //在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信  
    11.         msgApi.sendReq(req);<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">     </span>  



    注意微信支付,分享,登陆,需要打包后二次签名:才能相应:
    可以下载一个获取包的签名工具GenSignature.Apk,下载到手机上,手机上安装打包的Apk即可,得到:


    得到后登陆微信开发者平台在填写即可:


    这样一个完整的支付功能就做完了

  • 相关阅读:
    决定Java程序员工资高低的三个因素
    Java常见面试题汇总(七)
    Java的 RMI与RPC的区别
    2019新版Java学习路径
    JAVA中String,StringBuilder以及StringBuffer三个类之间的区别
    2019Java开发学习路线图
    bzoj1458 士兵占领
    bzoj1303 [CQOI2009]中位数图
    bzoj3721 [PA2014 Final] Bazarek
    bzoj2659 [Beijing wc2012]算不出的算式
  • 原文地址:https://www.cnblogs.com/jpfss/p/9888175.html
Copyright © 2020-2023  润新知