收银台APP开发(含微信和支付宝)

先介绍下背景哈,我朋友是搞PHP的,他之前搞了一个收银台,和小猪收银台的功能是相识的,先上个图哈。
收银台图片
我决定把这个做成APP版本的。(ps:原因是里面有扫码支付和扫码退款的功能,网站上的这些功能只能用扫码枪扫描,但是我们没这些设备。不过现在智能手机也能扫描二维码,所以我们便做了收银台的APP版本。)我花费了一些时间去熟悉这些功能。最开始我想的是独立去实现这些功能。但是我在微信和支付宝的官方文档,下图是支付宝的当面付的说明。支付宝当面付
我便意识到当面付的功能一般是放在服务器上,而不是移动端的。于是让我们php给我写了些接口,我直接调用这些接口,具体的逻辑的处理放在服务器上,这一下子就减轻了好多负担。简单的贴下图:
这里写图片描述
开始写代码之前,我先思考了下大概的框架。建立了如下的包。
这里写图片描述
毕竟是需要上线的代码,所以需要检测代码的异常。我在这里采用了腾讯的Bugly,腾讯bugly地址
http://blog.csdn.net/sinyu890807/article/details/51019856
然后还需要二维码扫描的功能,我在这里采用了Zxing。Zxing的项目地址为:Zxing地址。同时还参考了郭神的项目: Android二维码功能实现,在程序内嵌入ZXing项目项目是需要和服务器交互的,自然少不了和服务器交互,为此引入了okhttp,okhttp Github地址
至此,所需要的第三方jar包已全部引入完毕,可以开始正式项目的编写了。对了,还有一点要注意,因为引用第三方jar包,所以最后打包时,想要混淆的时候,有可能无法通过。向这样;
这里写图片描述 所以要在proguard-rules.pro文件里配置下,比如这个警告,这样配置就可以:-dontwarn okio.** 其他的也类似。但是不建议到最后项目完成的时候再配置,一般如果引用第三方jar的话,最好立刻配置。
1.我首先写了一个BaseActivity,里面放置了公共的代码
protected NetWorkChangerReceiver mReceiver;
protected IntentFilter mFilter;
public ActionBar actionBar;
public OkHttpClient mOkHttpClient;
public SharedPreferences mSharedPreference;
public SharedPreferences.Editor mEditor;

然后在onCreate()方法中进行实例化。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle("");
        mOkHttpClient = new OkHttpClient();
        mReceiver = new NetWorkChangerReceiver();
        mFilter = new IntentFilter();
        mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        //实现记住密码
        mSharedPreference = PreferenceManager.getDefaultSharedPreferences(this);
        mEditor = mSharedPreference.edit();
    }

2.因为网络请求是异步的,所以我写了一个类 BaseAsyTask
简要的代码如下所示。

    protected static OkHttpClient okHttpClient;
    protected static ProgressDialog pDialog = null;
    private Context context = null;
    protected static FormBody.Builder builder = new          FormBody.Builder();
    protected static Request request = null;
    protected static Response response = null;
    protected static String string;
    protected static JSONObject jsonObject;
    protected static String seesion = null;
    public String serverUrl;
    protected static SharedPreferences    sharedPreference;

    protected static SharedPreferences.Editor editor;
    //表示哪个Activity传递过来
    private String TAG;

之后在BaseAsyTask的构造方法中去实例化这些变量。
在onPreExecute()去显示一个Dialog,并且实例化Request请求

request = new Request.Builder().addHeader("Cookie", cooike).
                    url(URL).
                    post(builder.build()).build();

这里采用post方式。

 @Override
    protected String doInBackground(String... params) {

        return null;
    }

doInBackground()是一个空方法,在相应子类中,实现对应的逻辑即可。

 @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        pDialog.dismiss();
    }

onPostExecute(String s)这里也仅仅让pDialog消失,具体的逻辑依然在子类中去实现。
3。应用需要随时判断是否联网,这里注册了一个广播,用于提醒用户。

public class NetWorkChangerReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = connectivityManager.getActiveNetworkInfo();
        if (info != null && info.isAvailable()) {
        } else {
            ToasUtils.showToast(context, "当前网络不可用");
        }
    }
}

4.登录功能就不说了,比较简单,调用服务器的接口,处理下数据就可以了。先说下微信的收款功能。先放图吧。
微信收银
在WeiXinShouYinActivity里处理俩个功能,一个是根据用户输入的金额,弹出一个收款的二维码,用户扫描即可付款。另外一个是打开扫一扫,扫描用户的付款码(这里拿到的是用户的付款嘛上面的数字),完成收款。这俩种还是不一样的。大家可以在这里去详细的了解。先说第一个功能吧。根据用户输入的金额,携带需要的参数发送给服务器,根据服务器返回数据生成二维码即可。这里要注意的是,你使用的支付模式一还是支付模式二,如果弄错了的话,是无法完成收款的。
第二个功能是扫码支付。也是本APP最为核心的部分。这个逻辑是商家输入金额后,点击扫一扫收款,会打开二维码扫描的界面,这里要注意,二维码扫描需要用到摄像头,如果要兼容6.0的话,需要动态申请权限。

 //获取动态权限
   if (Build.VERSION.SDK_INT >= 23) {
      if (ContextCompat.checkSelfPermission(WeiXinShouYinActivity.this,
                                    Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                                ActivityCompat.requestPermissions(WeiXinShouYinActivity.this,
                                        new String[]{Manifest.permission.CAMERA},
                                        REQUEST_PERMISSION_CAMERA_CODE);
                            } else {
                                openScan();
                            }
                        } else {
                            openScan();
                        }

openScan()这个函数表示用Intent去打开二维码扫描的Activity,这里就不再贴出了。
注意,这个地方还要写一个回调函数,如果用户未授予权限的处理。我在这里弹出一个dialog,提示下用户,并且询问用户是否重新开启该权限。
代码如下:@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION_CAMERA_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openScan();
} else {
dialog();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}

在二维码扫描的Activity中的handleDecode()函数中,可以得到用户付款码的信息,然后携带用户的信息,以及收款金额,异步传递给服务器,然后等待服务器处理完毕,处理下返回的数据即可。
此时,微信收款的俩种功能均已完成。支付宝的流程和微信的类似,不在赘述。
由于毕竟是公司的代码,不方便全部上传,如果有哪位朋友有需要的话,我很乐意与你交流。

猜你喜欢

转载自blog.csdn.net/hjshpu/article/details/53610983